Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(393)

Unified Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1806983002: Update how we send draws to gpu backend to reduce state setting. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/gpu/gl/GrGLGpu.cpp
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index f742efe70d1b829fb4135ce4d21b93426cad3dfb..352927b436266b0a27ce52467b0d735df8d0402b 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -2071,15 +2071,14 @@ void GrGLGpu::flushScissor(const GrScissorState& scissorState,
this->disableScissor();
}
-bool GrGLGpu::flushGLState(const DrawArgs& args) {
+bool GrGLGpu::flushGLState(const GrPipeline& pipeline, const GrPrimitiveProcessor& primProc) {
GrXferProcessor::BlendInfo blendInfo;
- const GrPipeline& pipeline = *args.fPipeline;
- args.fPipeline->getXferProcessor().getBlendInfo(&blendInfo);
+ pipeline.getXferProcessor().getBlendInfo(&blendInfo);
this->flushColorWrite(blendInfo.fWriteColor);
this->flushDrawFace(pipeline.getDrawFace());
- SkAutoTUnref<GrGLProgram> program(fProgramCache->refProgram(args));
+ SkAutoTUnref<GrGLProgram> program(fProgramCache->refProgram(this, pipeline, primProc));
if (!program) {
GrCapsDebugf(this->caps(), "Failed to create program!\n");
return false;
@@ -2094,12 +2093,12 @@ bool GrGLGpu::flushGLState(const DrawArgs& args) {
if (blendInfo.fWriteColor) {
// Swizzle the blend to match what the shader will output.
const GrSwizzle& swizzle = this->glCaps().glslCaps()->configOutputSwizzle(
- args.fPipeline->getRenderTarget()->config());
+ pipeline.getRenderTarget()->config());
this->flushBlend(blendInfo, swizzle);
}
SkSTArray<8, const GrTextureAccess*> textureAccesses;
- program->setData(*args.fPrimitiveProcessor, pipeline, &textureAccesses);
+ program->setData(primProc, pipeline, &textureAccesses);
int numTextureAccesses = textureAccesses.count();
for (int i = 0; i < numTextureAccesses; i++) {
@@ -2170,14 +2169,6 @@ void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc,
}
}
-void GrGLGpu::buildProgramDesc(GrProgramDesc* desc,
- const GrPrimitiveProcessor& primProc,
- const GrPipeline& pipeline) const {
- if (!GrGLProgramDescBuilder::Build(desc, primProc, pipeline, *this->glCaps().glslCaps())) {
- SkDEBUGFAIL("Failed to generate GL program descriptor");
- }
-}
-
void GrGLGpu::bindBuffer(GrGLuint id, GrGLenum type) {
this->handleDirtyContext();
switch (type) {
@@ -2918,55 +2909,73 @@ GrGLenum gPrimitiveType2GLMode[] = {
#endif
#endif
-void GrGLGpu::onDraw(const DrawArgs& args, const GrNonInstancedVertices& vertices) {
- if (!this->flushGLState(args)) {
+void GrGLGpu::onDraw(const GrPipeline& pipeline,
+ const GrPrimitiveProcessor& primProc,
+ GrPrimitiveType primitiveType,
+ const GrVertices* vertArray,
+ int drawCount) {
+ if (!this->flushGLState(pipeline, primProc)) {
return;
}
+ GrPixelLocalStorageState plsState = primProc.getPixelLocalStorageState();
- GrPixelLocalStorageState plsState = args.fPrimitiveProcessor->getPixelLocalStorageState();
- if (!fHWPLSEnabled && plsState !=
- GrPixelLocalStorageState::kDisabled_GrPixelLocalStorageState) {
- GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
- this->setupPixelLocalStorage(args);
- fHWPLSEnabled = true;
- }
- if (plsState == GrPixelLocalStorageState::kFinish_GrPixelLocalStorageState) {
- GrStencilSettings stencil;
- stencil.setDisabled();
- this->flushStencil(stencil);
- }
- size_t indexOffsetInBytes = 0;
- this->setupGeometry(*args.fPrimitiveProcessor, vertices, &indexOffsetInBytes);
+ for (int i = 0; i < drawCount; ++i) {
+ if (GrXferBarrierType barrierType = pipeline.xferBarrierType(*this->caps())) {
+ this->xferBarrier(pipeline.getRenderTarget(), barrierType);
+ }
- SkASSERT((size_t)vertices.primitiveType() < SK_ARRAY_COUNT(gPrimitiveType2GLMode));
+ const GrVertices& vertices = vertArray[i];
+ GrVertices::Iterator iter;
+ const GrNonInstancedVertices* verts = iter.init(vertices);
+ do {
+ if (!fHWPLSEnabled && plsState !=
egdaniel 2016/03/16 19:55:35 Ethan do you know if all this PLS stuff needs to s
bsalomon 2016/03/16 20:07:22 Seems like it could all move out since all we're d
ethannicholas 2016/03/16 21:14:19 Agreed.
egdaniel 2016/03/17 15:09:36 Done.
+ GrPixelLocalStorageState::kDisabled_GrPixelLocalStorageState) {
+ GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
+ this->setupPixelLocalStorage(pipeline, primProc);
+ fHWPLSEnabled = true;
+ }
+ if (plsState == GrPixelLocalStorageState::kFinish_GrPixelLocalStorageState) {
+ GrStencilSettings stencil;
+ stencil.setDisabled();
+ this->flushStencil(stencil);
+ }
- if (vertices.isIndexed()) {
- GrGLvoid* indices =
- reinterpret_cast<GrGLvoid*>(indexOffsetInBytes + sizeof(uint16_t) *
- vertices.startIndex());
- // info.startVertex() was accounted for by setupGeometry.
- GL_CALL(DrawElements(gPrimitiveType2GLMode[vertices.primitiveType()],
- vertices.indexCount(),
- GR_GL_UNSIGNED_SHORT,
- indices));
- } else {
- // Pass 0 for parameter first. We have to adjust glVertexAttribPointer() to account for
- // startVertex in the DrawElements case. So we always rely on setupGeometry to have
- // accounted for startVertex.
- GL_CALL(DrawArrays(gPrimitiveType2GLMode[vertices.primitiveType()], 0,
- vertices.vertexCount()));
- }
+ size_t indexOffsetInBytes = 0;
+ this->setupGeometry(primProc, *verts, &indexOffsetInBytes);
+
+ if (verts->isIndexed()) {
+ GrGLvoid* indices =
+ reinterpret_cast<GrGLvoid*>(indexOffsetInBytes + sizeof(uint16_t) *
+ verts->startIndex());
+ // info.startVertex() was accounted for by setupGeometry.
+ GL_CALL(DrawElements(gPrimitiveType2GLMode[primitiveType],
+ verts->indexCount(),
+ GR_GL_UNSIGNED_SHORT,
+ indices));
+ } else {
+ // Pass 0 for parameter first. We have to adjust glVertexAttribPointer() to account
+ // for startVertex in the DrawElements case. So we always rely on setupGeometry to
+ // have accounted for startVertex.
+ GL_CALL(DrawArrays(gPrimitiveType2GLMode[primitiveType], 0,
+ verts->vertexCount()));
+ }
- if (fHWPLSEnabled && plsState == GrPixelLocalStorageState::kFinish_GrPixelLocalStorageState) {
- // PLS draws always involve multiple draws, finishing up with a non-PLS
- // draw that writes to the color buffer. That draw ends up here; we wait
- // until after it is complete to actually disable PLS.
- GL_CALL(Disable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
- fHWPLSEnabled = false;
- this->disableScissor();
+ if (fHWPLSEnabled &&
+ plsState == GrPixelLocalStorageState::kFinish_GrPixelLocalStorageState) {
+ // PLS draws always involve multiple draws, finishing up with a non-PLS
+ // draw that writes to the color buffer. That draw ends up here; we wait
+ // until after it is complete to actually disable PLS.
+ GL_CALL(Disable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE));
+ fHWPLSEnabled = false;
+ this->disableScissor();
+ }
+
+ fStats.incNumDraws();
+ } while ((verts = iter.next()));
}
+
#if SWAP_PER_DRAW
glFlush();
#if defined(SK_BUILD_FOR_MAC)
@@ -3009,13 +3018,14 @@ void GrGLGpu::stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGL
}
}
-void GrGLGpu::setupPixelLocalStorage(const DrawArgs& args) {
+void GrGLGpu::setupPixelLocalStorage(const GrPipeline& pipeline,
+ const GrPrimitiveProcessor& primProc) {
fPLSHasBeenUsed = true;
const SkRect& bounds =
- static_cast<const GrPLSGeometryProcessor*>(args.fPrimitiveProcessor)->getBounds();
+ static_cast<const GrPLSGeometryProcessor&>(primProc).getBounds();
// setup pixel local storage -- this means capturing and storing the current framebuffer color
// and initializing the winding counts to zero
- GrRenderTarget* rt = args.fPipeline->getRenderTarget();
+ GrRenderTarget* rt = pipeline.getRenderTarget();
SkScalar width = SkIntToScalar(rt->width());
SkScalar height = SkIntToScalar(rt->height());
// dst rect edges in NDC (-1 to 1)

Powered by Google App Engine
This is Rietveld 408576698