/* * 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()); }