| /* | |
| * Copyright 2015 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "GrGpuCommandBuffer.h" | |
| #include "GrMeshDrawOp.h" | |
| #include "GrOpFlushState.h" | |
| #include "GrResourceProvider.h" | |
| GrMeshDrawOp::GrMeshDrawOp(uint32_t classID) : INHERITED(classID) {} | |
| void GrMeshDrawOp::onPrepare(GrOpFlushState* state) { this->onPrepareDraws(state); } | |
| void* GrMeshDrawOp::PatternHelper::init(Target* target, size_t vertexStride, | |
| const GrBuffer* indexBuffer, int verticesPerRepetition, | |
| int indicesPerRepetition, int repeatCount) { | |
| SkASSERT(target); | |
| if (!indexBuffer) { | |
| return nullptr; | |
| } | |
| const GrBuffer* vertexBuffer; | |
| int firstVertex; | |
| int vertexCount = verticesPerRepetition * repeatCount; | |
| void* vertices = | |
| target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, &firstVertex); | |
| if (!vertices) { | |
| SkDebugf("Vertices could not be allocated for instanced rendering."); | |
| return nullptr; | |
| } | |
| SkASSERT(vertexBuffer); | |
| size_t ibSize = indexBuffer->gpuMemorySize(); | |
| int maxRepetitions = static_cast<int>(ibSize / (sizeof(uint16_t) * indicesPerRepetition)); | |
| fMesh.setIndexedPatterned(indexBuffer, indicesPerRepetition, verticesPerRepetition, | |
| repeatCount, maxRepetitions); | |
| fMesh.setVertexData(vertexBuffer, firstVertex); | |
| return vertices; | |
| } | |
| void GrMeshDrawOp::PatternHelper::recordDraw(Target* target, const GrGeometryProcessor* gp, | |
| const GrPipeline* pipeline) { | |
| target->draw(gp, pipeline, fMesh); | |
| } | |
| void* GrMeshDrawOp::QuadHelper::init(Target* target, size_t vertexStride, int quadsToDraw) { | |
| sk_sp<const GrBuffer> quadIndexBuffer = target->resourceProvider()->refQuadIndexBuffer(); | |
| if (!quadIndexBuffer) { | |
| SkDebugf("Could not get quad index buffer."); | |
| return nullptr; | |
| } | |
| return this->INHERITED::init(target, vertexStride, quadIndexBuffer.get(), kVerticesPerQuad, | |
| kIndicesPerQuad, quadsToDraw); | |
| } | |
| void GrMeshDrawOp::onExecute(GrOpFlushState* state) { | |
| state->executeDrawsAndUploadsForMeshDrawOp(this->uniqueID(), this->bounds()); | |
| } |