| Index: src/gpu/gl/GrGLGpu.cpp
|
| diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
|
| index f75c1a5078366482d22da6e3146d3745c9859783..a136496ef5fe5836e5ccf7aa921c4837d11a8b91 100644
|
| --- a/src/gpu/gl/GrGLGpu.cpp
|
| +++ b/src/gpu/gl/GrGLGpu.cpp
|
| @@ -232,8 +232,8 @@
|
| if (this->glCaps().shaderCaps()->pathRenderingSupport()) {
|
| fPathRendering.reset(new GrGLPathRendering(this));
|
| }
|
| +
|
| this->createCopyPrograms();
|
| - fWireRectProgram.fProgram = 0;
|
| }
|
|
|
| GrGLGpu::~GrGLGpu() {
|
| @@ -258,17 +258,8 @@
|
| GL_CALL(DeleteProgram(fCopyPrograms[i].fProgram));
|
| }
|
| }
|
| -
|
| if (0 != fCopyProgramArrayBuffer) {
|
| GL_CALL(DeleteBuffers(1, &fCopyProgramArrayBuffer));
|
| - }
|
| -
|
| - if (0 != fWireRectProgram.fProgram) {
|
| - GL_CALL(DeleteProgram(fWireRectProgram.fProgram));
|
| - }
|
| -
|
| - if (0 != fWireRectArrayBuffer) {
|
| - GL_CALL(DeleteBuffers(1, &fWireRectArrayBuffer));
|
| }
|
|
|
| delete fProgramCache;
|
| @@ -285,8 +276,6 @@
|
| for (size_t i = 0; i < SK_ARRAY_COUNT(fCopyPrograms); ++i) {
|
| fCopyPrograms[i].fProgram = 0;
|
| }
|
| - fWireRectProgram.fProgram = 0;
|
| - fWireRectArrayBuffer = 0;
|
| if (this->glCaps().shaderCaps()->pathRenderingSupport()) {
|
| this->glPathRendering()->abandonGpuResources();
|
| }
|
| @@ -2990,6 +2979,7 @@
|
| return false;
|
| }
|
|
|
| +
|
| void GrGLGpu::createCopyPrograms() {
|
| for (size_t i = 0; i < SK_ARRAY_COUNT(fCopyPrograms); ++i) {
|
| fCopyPrograms[i].fProgram = 0;
|
| @@ -3010,7 +3000,7 @@
|
| GrShaderVar::kVaryingOut_TypeModifier);
|
| GrGLSLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType,
|
| GrShaderVar::kOut_TypeModifier);
|
| -
|
| +
|
| SkString vshaderTxt(version);
|
| aVertex.appendDecl(this->glCaps().glslCaps(), &vshaderTxt);
|
| vshaderTxt.append(";");
|
| @@ -3106,160 +3096,6 @@
|
| GR_GL_STATIC_DRAW));
|
| }
|
|
|
| -void GrGLGpu::createWireRectProgram() {
|
| - SkASSERT(!fWireRectProgram.fProgram);
|
| - GrGLSLShaderVar uColor("u_color", kVec4f_GrSLType, GrShaderVar::kUniform_TypeModifier);
|
| - GrGLSLShaderVar uRect("u_rect", kVec4f_GrSLType, GrShaderVar::kUniform_TypeModifier);
|
| - GrGLSLShaderVar aVertex("a_vertex", kVec2f_GrSLType, GrShaderVar::kAttribute_TypeModifier);
|
| - const char* version = this->glCaps().glslCaps()->versionDeclString();
|
| -
|
| - // The rect uniform specifies the rectangle in NDC space as a vec4 (left,top,right,bottom). The
|
| - // program is used with a vbo containing the unit square. Vertices are computed from the rect
|
| - // uniform using the 4 vbo vertices.
|
| - SkString vshaderTxt(version);
|
| - aVertex.appendDecl(this->glCaps().glslCaps(), &vshaderTxt);
|
| - vshaderTxt.append(";");
|
| - uRect.appendDecl(this->glCaps().glslCaps(), &vshaderTxt);
|
| - vshaderTxt.append(";");
|
| - vshaderTxt.append(
|
| - "// Wire Rect Program VS\n"
|
| - "void main() {"
|
| - " gl_Position.x = u_rect.x + a_vertex.x * (u_rect.z - u_rect.x);"
|
| - " gl_Position.y = u_rect.y + a_vertex.y * (u_rect.w - u_rect.y);"
|
| - " gl_Position.zw = vec2(0, 1);"
|
| - "}"
|
| - );
|
| -
|
| - GrGLSLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
|
| -
|
| - SkString fshaderTxt(version);
|
| - GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision,
|
| - *this->glCaps().glslCaps(),
|
| - &fshaderTxt);
|
| - uColor.appendDecl(this->glCaps().glslCaps(), &fshaderTxt);
|
| - fshaderTxt.append(";");
|
| - const char* fsOutName;
|
| - if (this->glCaps().glslCaps()->mustDeclareFragmentShaderOutput()) {
|
| - oFragColor.appendDecl(this->glCaps().glslCaps(), &fshaderTxt);
|
| - fshaderTxt.append(";");
|
| - fsOutName = oFragColor.c_str();
|
| - } else {
|
| - fsOutName = "gl_FragColor";
|
| - }
|
| - fshaderTxt.appendf(
|
| - "// Write Rect Program FS\n"
|
| - "void main() {"
|
| - " %s = %s;"
|
| - "}",
|
| - fsOutName,
|
| - uColor.c_str()
|
| - );
|
| -
|
| - GL_CALL_RET(fWireRectProgram.fProgram, CreateProgram());
|
| - const char* str;
|
| - GrGLint length;
|
| -
|
| - str = vshaderTxt.c_str();
|
| - length = SkToInt(vshaderTxt.size());
|
| - GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fWireRectProgram.fProgram,
|
| - GR_GL_VERTEX_SHADER, &str, &length, 1,
|
| - &fStats);
|
| -
|
| - str = fshaderTxt.c_str();
|
| - length = SkToInt(fshaderTxt.size());
|
| - GrGLuint fshader = GrGLCompileAndAttachShader(*fGLContext, fWireRectProgram.fProgram,
|
| - GR_GL_FRAGMENT_SHADER, &str, &length, 1,
|
| - &fStats);
|
| -
|
| - GL_CALL(LinkProgram(fWireRectProgram.fProgram));
|
| -
|
| - GL_CALL_RET(fWireRectProgram.fColorUniform,
|
| - GetUniformLocation(fWireRectProgram.fProgram, "u_color"));
|
| - GL_CALL_RET(fWireRectProgram.fRectUniform,
|
| - GetUniformLocation(fWireRectProgram.fProgram, "u_rect"));
|
| - GL_CALL(BindAttribLocation(fWireRectProgram.fProgram, 0, "a_vertex"));
|
| -
|
| - GL_CALL(DeleteShader(vshader));
|
| - GL_CALL(DeleteShader(fshader));
|
| - GL_CALL(GenBuffers(1, &fWireRectArrayBuffer));
|
| - fHWGeometryState.setVertexBufferID(this, fWireRectArrayBuffer);
|
| - static const GrGLfloat vdata[] = {
|
| - 0, 0,
|
| - 0, 1,
|
| - 1, 1,
|
| - 1, 0,
|
| - };
|
| - GL_ALLOC_CALL(this->glInterface(),
|
| - BufferData(GR_GL_ARRAY_BUFFER,
|
| - (GrGLsizeiptr) sizeof(vdata),
|
| - vdata, // data ptr
|
| - GR_GL_STATIC_DRAW));
|
| -}
|
| -
|
| -void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor color) {
|
| - this->handleDirtyContext();
|
| - if (!fWireRectProgram.fProgram) {
|
| - this->createWireRectProgram();
|
| - }
|
| -
|
| - int w = rt->width();
|
| - int h = rt->height();
|
| -
|
| - // Compute the edges of the rectangle (top,left,right,bottom) in NDC space. Must consider
|
| - // whether the render target is flipped or not.
|
| - GrGLfloat edges[4];
|
| - edges[0] = SkIntToScalar(rect.fLeft) + 0.5f;
|
| - edges[2] = SkIntToScalar(rect.fRight) - 0.5f;
|
| - if (kBottomLeft_GrSurfaceOrigin == rt->origin()) {
|
| - edges[1] = h - (SkIntToScalar(rect.fTop) + 0.5f);
|
| - edges[3] = h - (SkIntToScalar(rect.fBottom) - 0.5f);
|
| - } else {
|
| - edges[1] = SkIntToScalar(rect.fTop) + 0.5f;
|
| - edges[3] = SkIntToScalar(rect.fBottom) - 0.5f;
|
| - }
|
| - edges[0] = 2 * edges[0] / w - 1.0f;
|
| - edges[1] = 2 * edges[1] / h - 1.0f;
|
| - edges[2] = 2 * edges[2] / w - 1.0f;
|
| - edges[3] = 2 * edges[3] / h - 1.0f;
|
| -
|
| - GrGLfloat channels[4];
|
| - static const GrGLfloat scale255 = 1.f / 255.f;
|
| - channels[0] = GrColorUnpackR(color) * scale255;
|
| - channels[1] = GrColorUnpackG(color) * scale255;
|
| - channels[2] = GrColorUnpackB(color) * scale255;
|
| - channels[3] = GrColorUnpackA(color) * scale255;
|
| -
|
| - GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(rt->asRenderTarget());
|
| - this->flushRenderTarget(glRT, &rect);
|
| -
|
| - GL_CALL(UseProgram(fWireRectProgram.fProgram));
|
| - fHWProgramID = fWireRectProgram.fProgram;
|
| -
|
| - fHWGeometryState.setVertexArrayID(this, 0);
|
| -
|
| - GrGLAttribArrayState* attribs =
|
| - fHWGeometryState.bindArrayAndBufferToDraw(this, fWireRectArrayBuffer);
|
| - attribs->set(this, 0, fWireRectArrayBuffer, 2, GR_GL_FLOAT, false, 2 * sizeof(GrGLfloat), 0);
|
| - attribs->disableUnusedArrays(this, 0x1);
|
| -
|
| - GL_CALL(Uniform4fv(fWireRectProgram.fRectUniform, 1, edges));
|
| - GL_CALL(Uniform4fv(fWireRectProgram.fColorUniform, 1, channels));
|
| -
|
| - GrXferProcessor::BlendInfo blendInfo;
|
| - blendInfo.reset();
|
| - this->flushBlend(blendInfo);
|
| - this->flushColorWrite(true);
|
| - this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
|
| - this->flushHWAAState(glRT, false);
|
| - this->disableScissor();
|
| - GrStencilSettings stencil;
|
| - stencil.setDisabled();
|
| - this->flushStencil(stencil);
|
| -
|
| - GL_CALL(DrawArrays(GR_GL_LINE_LOOP, 0, 4));
|
| -}
|
| -
|
| -
|
| void GrGLGpu::copySurfaceAsDraw(GrSurface* dst,
|
| GrSurface* src,
|
| const SkIRect& srcRect,
|
| @@ -3284,7 +3120,8 @@
|
|
|
| GrGLAttribArrayState* attribs =
|
| fHWGeometryState.bindArrayAndBufferToDraw(this, fCopyProgramArrayBuffer);
|
| - attribs->set(this, 0, fCopyProgramArrayBuffer, 2, GR_GL_FLOAT, false, 2 * sizeof(GrGLfloat), 0);
|
| + attribs->set(this, 0, fCopyProgramArrayBuffer, 2, GR_GL_FLOAT, false,
|
| + 2 * sizeof(GrGLfloat), 0);
|
| attribs->disableUnusedArrays(this, 0x1);
|
|
|
| // dst rect edges in NDC (-1 to 1)
|
|
|