• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "GrVertexBatch.h"
9 #include "GrBatchFlushState.h"
10 #include "GrResourceProvider.h"
11 
GrVertexBatch(uint32_t classID)12 GrVertexBatch::GrVertexBatch(uint32_t classID) : INHERITED(classID) {}
13 
onPrepare(GrBatchFlushState * state)14 void GrVertexBatch::onPrepare(GrBatchFlushState* state) {
15     Target target(state, this);
16     this->onPrepareDraws(&target);
17 }
18 
init(Target * target,GrPrimitiveType primType,size_t vertexStride,const GrIndexBuffer * indexBuffer,int verticesPerInstance,int indicesPerInstance,int instancesToDraw)19 void* GrVertexBatch::InstancedHelper::init(Target* target, GrPrimitiveType primType,
20                                            size_t vertexStride, const GrIndexBuffer* indexBuffer,
21                                            int verticesPerInstance, int indicesPerInstance,
22                                            int instancesToDraw) {
23     SkASSERT(target);
24     if (!indexBuffer) {
25         return nullptr;
26     }
27     const GrVertexBuffer* vertexBuffer;
28     int firstVertex;
29     int vertexCount = verticesPerInstance * instancesToDraw;
30     void* vertices = target->makeVertexSpace(vertexStride, vertexCount, &vertexBuffer, &firstVertex);
31     if (!vertices) {
32         SkDebugf("Vertices could not be allocated for instanced rendering.");
33         return nullptr;
34     }
35     SkASSERT(vertexBuffer);
36     size_t ibSize = indexBuffer->gpuMemorySize();
37     int maxInstancesPerDraw = static_cast<int>(ibSize / (sizeof(uint16_t) * indicesPerInstance));
38 
39     fVertices.initInstanced(primType, vertexBuffer, indexBuffer,
40         firstVertex, verticesPerInstance, indicesPerInstance, instancesToDraw,
41         maxInstancesPerDraw);
42     return vertices;
43 }
44 
recordDraw(Target * target)45 void GrVertexBatch::InstancedHelper::recordDraw(Target* target) {
46     SkASSERT(fVertices.instanceCount());
47     target->draw(fVertices);
48 }
49 
init(Target * target,size_t vertexStride,int quadsToDraw)50 void* GrVertexBatch::QuadHelper::init(Target* target, size_t vertexStride,
51                                       int quadsToDraw) {
52     SkAutoTUnref<const GrIndexBuffer> quadIndexBuffer(
53         target->resourceProvider()->refQuadIndexBuffer());
54     if (!quadIndexBuffer) {
55         SkDebugf("Could not get quad index buffer.");
56         return nullptr;
57     }
58     return this->INHERITED::init(target, kTriangles_GrPrimitiveType, vertexStride,
59                                  quadIndexBuffer, kVerticesPerQuad, kIndicesPerQuad, quadsToDraw);
60 }
61 
onDraw(GrBatchFlushState * state)62 void GrVertexBatch::onDraw(GrBatchFlushState* state) {
63     int uploadCnt = fInlineUploads.count();
64     int currUpload = 0;
65 
66     // Iterate of all the drawArrays. Before issuing the draws in each array, perform any inline
67     // uploads.
68     for (DrawArrayList::Iter da(fDrawArrays); da.get(); da.next()) {
69         state->advanceLastFlushedToken();
70         while (currUpload < uploadCnt &&
71                fInlineUploads[currUpload]->lastUploadToken() <= state->lastFlushedToken()) {
72             fInlineUploads[currUpload++]->upload(state->uploader());
73         }
74         const GrVertexBatch::DrawArray& drawArray = *da.get();
75         GrProgramDesc desc;
76         const GrPipeline* pipeline = this->pipeline();
77         const GrPrimitiveProcessor* primProc = drawArray.fPrimitiveProcessor.get();
78         state->gpu()->buildProgramDesc(&desc, *primProc, *pipeline);
79         GrGpu::DrawArgs args(primProc, pipeline, &desc);
80 
81         int drawCount = drawArray.fDraws.count();
82         for (int i = 0; i < drawCount; i++) {
83             state->gpu()->draw(args,  drawArray.fDraws[i]);
84         }
85     }
86 }
87