diff options
Diffstat (limited to 'gpu/include/GrContext_impl.h')
-rw-r--r-- | gpu/include/GrContext_impl.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/gpu/include/GrContext_impl.h b/gpu/include/GrContext_impl.h new file mode 100644 index 0000000..fdcb2b1 --- /dev/null +++ b/gpu/include/GrContext_impl.h @@ -0,0 +1,135 @@ +/* + Copyright 2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +#ifndef GrContext_impl_DEFINED +#define GrContext_impl_DEFINED + +template <typename POS_SRC, typename TEX_SRC, + typename COL_SRC, typename IDX_SRC> +inline void GrContext::drawCustomVertices(const GrPaint& paint, + GrPrimitiveType primitiveType, + const POS_SRC& posSrc, + const TEX_SRC* texCoordSrc, + const COL_SRC* colorSrc, + const IDX_SRC* idxSrc) { + + GrVertexLayout layout = 0; + + GrDrawTarget::AutoReleaseGeometry geo; + + GrDrawTarget* target = this->prepareToDraw(paint, kUnbuffered_DrawCategory); + + if (NULL != paint.getTexture()) { + if (NULL != texCoordSrc) { + layout |= GrDrawTarget::StageTexCoordVertexLayoutBit(0,0); + } else { + layout |= GrDrawTarget::StagePosAsTexCoordVertexLayoutBit(0); + } + } + + if (NULL != colorSrc) { + layout |= GrDrawTarget::kColor_VertexLayoutBit; + } + + int vertexCount = posSrc.count(); + int indexCount = (NULL != idxSrc) ? idxSrc->count() : 0; + + if (!geo.set(target, layout, vertexCount, indexCount)) { + GrPrintf("Failed to get space for vertices!"); + return; + } + + int texOffsets[GrDrawTarget::kMaxTexCoords]; + int colorOffset; + int vsize = GrDrawTarget::VertexSizeAndOffsetsByIdx(layout, + texOffsets, + &colorOffset); + void* curVertex = geo.vertices(); + + for (int i = 0; i < vertexCount; ++i) { + posSrc.writeValue(i, (GrPoint*)curVertex); + + if (texOffsets[0] > 0) { + texCoordSrc->writeValue(i, (GrPoint*)((intptr_t)curVertex + texOffsets[0])); + } + if (colorOffset > 0) { + colorSrc->writeValue(i, (GrColor*)((intptr_t)curVertex + colorOffset)); + } + curVertex = (void*)((intptr_t)curVertex + vsize); + } + + uint16_t* indices = (uint16_t*) geo.indices(); + for (int i = 0; i < indexCount; ++i) { + idxSrc->writeValue(i, indices + i); + } + + if (NULL == idxSrc) { + target->drawNonIndexed(primitiveType, 0, vertexCount); + } else { + target->drawIndexed(primitiveType, 0, 0, vertexCount, indexCount); + } +} + +class GrNullTexCoordSource { +public: + void writeValue(int i, GrPoint* dstCoord) const { GrAssert(false); } +}; + +class GrNullColorSource { +public: + void writeValue(int i, GrColor* dstColor) const { GrAssert(false); } +}; + +class GrNullIndexSource { +public: + void writeValue(int i, uint16_t* dstIndex) const { GrAssert(false); } + int count() const { GrAssert(false); return 0; } +}; + +template <typename POS_SRC> +inline void GrContext::drawCustomVertices(const GrPaint& paint, + GrPrimitiveType primitiveType, + const POS_SRC& posSrc) { + this->drawCustomVertices<POS_SRC, + GrNullTexCoordSource, + GrNullColorSource, + GrNullIndexSource>(paint, primitiveType, posSrc, + NULL, NULL, NULL); +} + +template <typename POS_SRC, typename TEX_SRC> +inline void GrContext::drawCustomVertices(const GrPaint& paint, + GrPrimitiveType primitiveType, + const POS_SRC& posSrc, + const TEX_SRC* texCoordSrc) { + this->drawCustomVertices<POS_SRC, TEX_SRC, + GrNullColorSource, + GrNullIndexSource>(paint, primitiveType, posSrc, + texCoordSrc, NULL, NULL); +} + +template <typename POS_SRC, typename TEX_SRC, typename COL_SRC> +inline void GrContext::drawCustomVertices(const GrPaint& paint, + GrPrimitiveType primitiveType, + const POS_SRC& posSrc, + const TEX_SRC* texCoordSrc, + const COL_SRC* colorSrc) { + drawCustomVertices<POS_SRC, TEX_SRC, COL_SRC, + GrNullIndexSource>(paint, primitiveType, posSrc, + texCoordSrc, colorSrc, NULL); +} + +#endif |