Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit ded4370

Browse files
csmartdalton86Skia Commit-Bot
authored andcommitted
Add a bindBuffers() call to GrOpsRenderPass
Adds a bindBuffers() call and removes the GrBuffer arguments from the draw calls. Change-Id: I43c2dd8afe80c41e48c1d9d5210affcfe6f095fc Reviewed-on: https://skia-review.googlesource.com/c/skia/+/273840 Commit-Queue: Chris Dalton <csmartdalton@google.com> Reviewed-by: Brian Salomon <bsalomon@google.com>
1 parent 4c0ffe7 commit ded4370

File tree

10 files changed

+282
-285
lines changed

10 files changed

+282
-285
lines changed

src/gpu/GrMesh.h

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -200,30 +200,33 @@ inline void GrMesh::setVertexData(sk_sp<const GrBuffer> vertexBuffer, int baseVe
200200
inline void GrMesh::draw(GrOpsRenderPass* opsRenderPass) const {
201201
if (this->isInstanced()) {
202202
if (!this->isIndexed()) {
203-
opsRenderPass->drawInstanced(fInstanceBuffer.get(), fInstanceData.fInstanceCount,
204-
fInstanceData.fBaseInstance, fVertexBuffer.get(),
203+
opsRenderPass->bindBuffers(nullptr, fInstanceBuffer.get(), fVertexBuffer.get());
204+
opsRenderPass->drawInstanced(fInstanceData.fInstanceCount, fInstanceData.fBaseInstance,
205205
fInstanceNonIndexData.fVertexCount, fBaseVertex);
206206
} else {
207+
opsRenderPass->bindBuffers(fIndexBuffer.get(), fInstanceBuffer.get(),
208+
fVertexBuffer.get(), this->primitiveRestart());
207209
opsRenderPass->drawIndexedInstanced(
208-
fIndexBuffer.get(), fInstanceIndexData.fIndexCount, 0, this->primitiveRestart(),
209-
fInstanceBuffer.get(), fInstanceData.fInstanceCount,
210-
fInstanceData.fBaseInstance, fVertexBuffer.get(), fBaseVertex);
210+
fInstanceIndexData.fIndexCount, 0, fInstanceData.fInstanceCount,
211+
fInstanceData.fBaseInstance, fBaseVertex);
211212
}
212213
return;
213214
}
214215

215216
if (!this->isIndexed()) {
216217
SkASSERT(fNonIndexNonInstanceData.fVertexCount > 0);
217-
opsRenderPass->draw(fVertexBuffer.get(), fNonIndexNonInstanceData.fVertexCount,
218-
fBaseVertex);
218+
opsRenderPass->bindBuffers(nullptr, nullptr, fVertexBuffer.get());
219+
opsRenderPass->draw(fNonIndexNonInstanceData.fVertexCount, fBaseVertex);
219220
return;
220221
}
221222

223+
opsRenderPass->bindBuffers(fIndexBuffer.get(), nullptr, fVertexBuffer.get(),
224+
this->primitiveRestart());
225+
222226
if (0 == fIndexData.fPatternRepeatCount) {
223-
opsRenderPass->drawIndexed(
224-
fIndexBuffer.get(), fIndexData.fIndexCount, fNonPatternIndexData.fBaseIndex,
225-
this->primitiveRestart(), fNonPatternIndexData.fMinIndexValue,
226-
fNonPatternIndexData.fMaxIndexValue, fVertexBuffer.get(), fBaseVertex);
227+
opsRenderPass->drawIndexed(fIndexData.fIndexCount, fNonPatternIndexData.fBaseIndex,
228+
fNonPatternIndexData.fMinIndexValue,
229+
fNonPatternIndexData.fMaxIndexValue, fBaseVertex);
227230
return;
228231
}
229232

@@ -237,8 +240,7 @@ inline void GrMesh::draw(GrOpsRenderPass* opsRenderPass) const {
237240
int minIndexValue = 0;
238241
int maxIndexValue = fPatternData.fVertexCount * repeatCount - 1;
239242
SkASSERT(!(fFlags & Flags::kUsePrimitiveRestart));
240-
opsRenderPass->drawIndexed(fIndexBuffer.get(), indexCount, 0, this->primitiveRestart(),
241-
minIndexValue, maxIndexValue, fVertexBuffer.get(),
243+
opsRenderPass->drawIndexed(indexCount, 0, minIndexValue, maxIndexValue,
242244
fBaseVertex + fPatternData.fVertexCount * baseRepetition);
243245
baseRepetition += repeatCount;
244246
} while (baseRepetition < fIndexData.fPatternRepeatCount);

src/gpu/GrOpsRenderPass.cpp

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,11 @@ void GrOpsRenderPass::bindPipeline(const GrProgramInfo& programInfo, const SkRec
9191
}
9292
fTextureBindingStatus = (hasTextures) ?
9393
DynamicStateStatus::kUninitialized : DynamicStateStatus::kDisabled;
94-
fHasVertexAttributes = programInfo.primProc().hasVertexAttributes();
95-
fHasInstanceAttributes = programInfo.primProc().hasInstanceAttributes();
94+
fHasIndexBuffer = false;
95+
fInstanceBufferStatus = (programInfo.primProc().hasInstanceAttributes()) ?
96+
DynamicStateStatus::kUninitialized : DynamicStateStatus::kDisabled;
97+
fVertexBufferStatus = (programInfo.primProc().hasVertexAttributes()) ?
98+
DynamicStateStatus::kUninitialized : DynamicStateStatus::kDisabled;
9699
#endif
97100

98101
fDrawPipelineStatus = DrawPipelineStatus::kOk;
@@ -149,6 +152,36 @@ void GrOpsRenderPass::drawMeshes(const GrProgramInfo& programInfo, const GrMesh
149152
}
150153
}
151154

155+
void GrOpsRenderPass::bindBuffers(const GrBuffer* indexBuffer, const GrBuffer* instanceBuffer,
156+
const GrBuffer* vertexBuffer, GrPrimitiveRestart primRestart) {
157+
if (DrawPipelineStatus::kOk != fDrawPipelineStatus) {
158+
SkASSERT(DrawPipelineStatus::kNotConfigured != fDrawPipelineStatus);
159+
return;
160+
}
161+
162+
#ifdef SK_DEBUG
163+
if (indexBuffer) {
164+
fHasIndexBuffer = true;
165+
}
166+
167+
SkASSERT((DynamicStateStatus::kDisabled == fInstanceBufferStatus) != SkToBool(instanceBuffer));
168+
if (instanceBuffer) {
169+
fInstanceBufferStatus = DynamicStateStatus::kConfigured;
170+
}
171+
172+
SkASSERT((DynamicStateStatus::kDisabled == fVertexBufferStatus) != SkToBool(vertexBuffer));
173+
if (vertexBuffer) {
174+
fVertexBufferStatus = DynamicStateStatus::kConfigured;
175+
}
176+
177+
if (GrPrimitiveRestart::kYes == primRestart) {
178+
SkASSERT(this->gpu()->caps()->usePrimitiveRestart());
179+
}
180+
#endif
181+
182+
this->onBindBuffers(indexBuffer, instanceBuffer, vertexBuffer, primRestart);
183+
}
184+
152185
bool GrOpsRenderPass::prepareToDraw() {
153186
if (DrawPipelineStatus::kOk != fDrawPipelineStatus) {
154187
SkASSERT(DrawPipelineStatus::kNotConfigured != fDrawPipelineStatus);
@@ -164,52 +197,45 @@ bool GrOpsRenderPass::prepareToDraw() {
164197
return true;
165198
}
166199

167-
void GrOpsRenderPass::draw(const GrBuffer* vertexBuffer, int vertexCount, int baseVertex) {
200+
void GrOpsRenderPass::draw(int vertexCount, int baseVertex) {
168201
if (!this->prepareToDraw()) {
169202
return;
170203
}
171-
SkASSERT(SkToBool(vertexBuffer) == fHasVertexAttributes);
172-
this->onDraw(vertexBuffer, vertexCount, baseVertex);
204+
SkASSERT(!fHasIndexBuffer);
205+
SkASSERT(DynamicStateStatus::kConfigured != fInstanceBufferStatus);
206+
SkASSERT(DynamicStateStatus::kUninitialized != fVertexBufferStatus);
207+
this->onDraw(vertexCount, baseVertex);
173208
}
174209

175-
void GrOpsRenderPass::drawIndexed(const GrBuffer* indexBuffer, int indexCount,
176-
int baseIndex, GrPrimitiveRestart primitiveRestart,
177-
uint16_t minIndexValue, uint16_t maxIndexValue,
178-
const GrBuffer* vertexBuffer, int baseVertex) {
210+
void GrOpsRenderPass::drawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue,
211+
uint16_t maxIndexValue, int baseVertex) {
179212
if (!this->prepareToDraw()) {
180213
return;
181214
}
182-
SkASSERT(GrPrimitiveRestart::kNo == primitiveRestart ||
183-
this->gpu()->caps()->usePrimitiveRestart());
184-
SkASSERT(SkToBool(vertexBuffer) == fHasVertexAttributes);
185-
this->onDrawIndexed(indexBuffer, indexCount, baseIndex, primitiveRestart, minIndexValue,
186-
maxIndexValue, vertexBuffer, baseVertex);
215+
SkASSERT(fHasIndexBuffer);
216+
SkASSERT(DynamicStateStatus::kConfigured != fInstanceBufferStatus);
217+
SkASSERT(DynamicStateStatus::kUninitialized != fVertexBufferStatus);
218+
this->onDrawIndexed(indexCount, baseIndex, minIndexValue, maxIndexValue, baseVertex);
187219
}
188220

189-
void GrOpsRenderPass::drawInstanced(const GrBuffer* instanceBuffer, int instanceCount, int
190-
baseInstance, const GrBuffer* vertexBuffer, int vertexCount,
221+
void GrOpsRenderPass::drawInstanced(int instanceCount, int baseInstance, int vertexCount,
191222
int baseVertex) {
192223
if (!this->prepareToDraw()) {
193224
return;
194225
}
195-
SkASSERT(SkToBool(vertexBuffer) == fHasVertexAttributes);
196-
SkASSERT(SkToBool(instanceBuffer) == fHasInstanceAttributes);
197-
this->onDrawInstanced(instanceBuffer, instanceCount, baseInstance, vertexBuffer, vertexCount,
198-
baseVertex);
226+
SkASSERT(!fHasIndexBuffer);
227+
SkASSERT(DynamicStateStatus::kUninitialized != fInstanceBufferStatus);
228+
SkASSERT(DynamicStateStatus::kUninitialized != fVertexBufferStatus);
229+
this->onDrawInstanced(instanceCount, baseInstance, vertexCount, baseVertex);
199230
}
200231

201-
void GrOpsRenderPass::drawIndexedInstanced(
202-
const GrBuffer* indexBuffer, int indexCount, int baseIndex,
203-
GrPrimitiveRestart primitiveRestart, const GrBuffer* instanceBuffer, int instanceCount,
204-
int baseInstance, const GrBuffer* vertexBuffer, int baseVertex) {
232+
void GrOpsRenderPass::drawIndexedInstanced(int indexCount, int baseIndex, int instanceCount,
233+
int baseInstance, int baseVertex) {
205234
if (!this->prepareToDraw()) {
206235
return;
207236
}
208-
SkASSERT(GrPrimitiveRestart::kNo == primitiveRestart ||
209-
this->gpu()->caps()->usePrimitiveRestart());
210-
SkASSERT(SkToBool(vertexBuffer) == fHasVertexAttributes);
211-
SkASSERT(SkToBool(instanceBuffer) == fHasInstanceAttributes);
212-
this->onDrawIndexedInstanced(indexBuffer, indexCount, baseIndex, primitiveRestart,
213-
instanceBuffer, instanceCount, baseInstance, vertexBuffer,
214-
baseVertex);
237+
SkASSERT(fHasIndexBuffer);
238+
SkASSERT(DynamicStateStatus::kUninitialized != fInstanceBufferStatus);
239+
SkASSERT(DynamicStateStatus::kUninitialized != fVertexBufferStatus);
240+
this->onDrawIndexedInstanced(indexCount, baseIndex, instanceCount, baseInstance, baseVertex);
215241
}

src/gpu/GrOpsRenderPass.h

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,34 @@ class GrOpsRenderPass {
6666
// again with a different array for primProcTextures. (On subsequent calls, if the backend is
6767
// capable of updating the primitive processor textures independently, then it will
6868
// automatically skip binding textures from GrPipeline.)
69+
//
70+
// If the current program does not use textures, this is a no-op.
6971
void bindTextures(const GrPrimitiveProcessor&, const GrPipeline&,
7072
const GrSurfaceProxy* const primProcTextures[]);
7173

74+
void bindBuffers(const GrBuffer* indexBuffer, const GrBuffer* instanceBuffer,
75+
const GrBuffer* vertexBuffer, GrPrimitiveRestart = GrPrimitiveRestart::kNo);
76+
7277
// Draws the given array of meshes using the current pipeline state. The client must call
7378
// bindPipeline() before using this method.
7479
//
7580
// NOTE: This method will soon be deleted. While it continues to exist, it takes care of calling
7681
// setScissor() and bindTextures() on the client's behalf.
7782
void drawMeshes(const GrProgramInfo&, const GrMesh[], int meshCount);
7883

79-
// These methods issue draws using the current pipeline state. The client must call
80-
// bindPipeline(), followed by setScissor() and/or bindTextures() if applicable, before using
81-
// these methods.
82-
void draw(const GrBuffer* vertexBuffer, int vertexCount, int baseVertex);
83-
void drawIndexed(const GrBuffer* indexBuffer, int indexCount, int baseIndex, GrPrimitiveRestart,
84-
uint16_t minIndexValue, uint16_t maxIndexValue, const GrBuffer* vertexBuffer,
84+
// These methods issue draws using the current pipeline state. Before drawing, the caller must
85+
// configure the pipeline and dynamic state:
86+
//
87+
// - Call bindPipeline()
88+
// - If the scissor test is enabled, call setScissorRect()
89+
// - If the current program uses textures, call bindTextures()
90+
// - Call bindBuffers() (even if all buffers are null)
91+
void draw(int vertexCount, int baseVertex);
92+
void drawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue, uint16_t maxIndexValue,
8593
int baseVertex);
86-
void drawInstanced(const GrBuffer* instanceBuffer, int instanceCount, int baseInstance,
87-
const GrBuffer* vertexBuffer, int vertexCount, int baseVertex);
88-
void drawIndexedInstanced(const GrBuffer* indexBuffer, int indexCount, int baseIndex,
89-
GrPrimitiveRestart, const GrBuffer* instanceBuffer, int instanceCount,
90-
int baseInstance, const GrBuffer* vertexBuffer, int baseVertex);
94+
void drawInstanced(int instanceCount, int baseInstance, int vertexCount, int baseVertex);
95+
void drawIndexedInstanced(int indexCount, int baseIndex, int instanceCount, int baseInstance,
96+
int baseVertex);
9197

9298
// Performs an upload of vertex data in the middle of a set of a set of draws
9399
virtual void inlineUpload(GrOpFlushState*, GrDeferredTextureUploadFn&) = 0;
@@ -132,17 +138,15 @@ class GrOpsRenderPass {
132138
virtual void onSetScissorRect(const SkIRect&) = 0;
133139
virtual bool onBindTextures(const GrPrimitiveProcessor&, const GrPipeline&,
134140
const GrSurfaceProxy* const primProcTextures[]) = 0;
135-
virtual void onDraw(const GrBuffer* vertexBuffer, int vertexCount, int baseVertex) = 0;
136-
virtual void onDrawIndexed(const GrBuffer* indexBuffer, int indexCount, int baseIndex,
137-
GrPrimitiveRestart, uint16_t minIndexValue, uint16_t maxIndexValue,
138-
const GrBuffer* vertexBuffer, int baseVertex) = 0;
139-
virtual void onDrawInstanced(const GrBuffer* instanceBuffer, int instanceCount,
140-
int baseInstance, const GrBuffer* vertexBuffer, int vertexCount,
141+
virtual void onBindBuffers(const GrBuffer* indexBuffer, const GrBuffer* instanceBuffer,
142+
const GrBuffer* vertexBuffer, GrPrimitiveRestart) = 0;
143+
virtual void onDraw(int vertexCount, int baseVertex) = 0;
144+
virtual void onDrawIndexed(int indexCount, int baseIndex, uint16_t minIndexValue,
145+
uint16_t maxIndexValue, int baseVertex) = 0;
146+
virtual void onDrawInstanced(int instanceCount, int baseInstance, int vertexCount,
141147
int baseVertex) = 0;
142-
virtual void onDrawIndexedInstanced(const GrBuffer* indexBuffer, int indexCount, int baseIndex,
143-
GrPrimitiveRestart, const GrBuffer* instanceBuffer,
144-
int instanceCount, int baseInstance,
145-
const GrBuffer* vertexBuffer, int baseVertex) = 0;
148+
virtual void onDrawIndexedInstanced(int indexCount, int baseIndex, int instanceCount,
149+
int baseInstance, int baseVertex) = 0;
146150
virtual void onClear(const GrFixedClip&, const SkPMColor4f&) = 0;
147151
virtual void onClearStencilClip(const GrFixedClip&, bool insideStencilMask) = 0;
148152
virtual void onExecuteDrawable(std::unique_ptr<SkDrawable::GpuDrawHandler>) {}
@@ -165,8 +169,9 @@ class GrOpsRenderPass {
165169

166170
DynamicStateStatus fScissorStatus = DynamicStateStatus::kDisabled;
167171
DynamicStateStatus fTextureBindingStatus = DynamicStateStatus::kDisabled;
168-
bool fHasVertexAttributes = false;
169-
bool fHasInstanceAttributes = false;
172+
bool fHasIndexBuffer = false;
173+
DynamicStateStatus fInstanceBufferStatus = DynamicStateStatus::kDisabled;
174+
DynamicStateStatus fVertexBufferStatus = DynamicStateStatus::kDisabled;
170175
#endif
171176

172177
typedef GrOpsRenderPass INHERITED;

0 commit comments

Comments
 (0)