| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrGLGpu.h" | 8 #include "GrGLGpu.h" |
| 9 #include "GrGLBuffer.h" | 9 #include "GrGLBuffer.h" |
| 10 #include "GrGLGLSL.h" | 10 #include "GrGLGLSL.h" |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 void GrGLGpu::createPLSSetupProgram() { | 290 void GrGLGpu::createPLSSetupProgram() { |
| 291 const GrGLSLCaps* glslCaps = this->glCaps().glslCaps(); | 291 const GrGLSLCaps* glslCaps = this->glCaps().glslCaps(); |
| 292 const char* version = glslCaps->versionDeclString(); | 292 const char* version = glslCaps->versionDeclString(); |
| 293 | 293 |
| 294 GrGLSLShaderVar aVertex("a_vertex", kVec2f_GrSLType, GrShaderVar::kAttribute
_TypeModifier); | 294 GrGLSLShaderVar aVertex("a_vertex", kVec2f_GrSLType, GrShaderVar::kAttribute
_TypeModifier); |
| 295 GrGLSLShaderVar uTexCoordXform("u_texCoordXform", kVec4f_GrSLType, | 295 GrGLSLShaderVar uTexCoordXform("u_texCoordXform", kVec4f_GrSLType, |
| 296 GrShaderVar::kUniform_TypeModifier); | 296 GrShaderVar::kUniform_TypeModifier); |
| 297 GrGLSLShaderVar uPosXform("u_posXform", kVec4f_GrSLType, GrShaderVar::kUnifo
rm_TypeModifier); | 297 GrGLSLShaderVar uPosXform("u_posXform", kVec4f_GrSLType, GrShaderVar::kUnifo
rm_TypeModifier); |
| 298 GrGLSLShaderVar uTexture("u_texture", kSampler2D_GrSLType, GrShaderVar::kUni
form_TypeModifier); | 298 GrGLSLShaderVar uTexture("u_texture", kSampler2D_GrSLType, GrShaderVar::kUni
form_TypeModifier); |
| 299 GrGLSLShaderVar vTexCoord("v_texCoord", kVec2f_GrSLType, GrShaderVar::kVaryi
ngOut_TypeModifier); | 299 GrGLSLShaderVar vTexCoord("v_texCoord", kVec2f_GrSLType, GrShaderVar::kVaryi
ngOut_TypeModifier); |
| 300 | 300 |
| 301 SkString vshaderTxt(version); | 301 SkString vshaderTxt(version); |
| 302 if (glslCaps->noperspectiveInterpolationSupport()) { | 302 if (glslCaps->noperspectiveInterpolationSupport()) { |
| 303 if (const char* extension = glslCaps->noperspectiveInterpolationExtensio
nString()) { | 303 if (const char* extension = glslCaps->noperspectiveInterpolationExtensio
nString()) { |
| 304 vshaderTxt.appendf("#extension %s : require\n", extension); | 304 vshaderTxt.appendf("#extension %s : require\n", extension); |
| 305 } | 305 } |
| 306 vTexCoord.addModifier("noperspective"); | 306 vTexCoord.addModifier("noperspective"); |
| 307 } | 307 } |
| 308 aVertex.appendDecl(glslCaps, &vshaderTxt); | 308 aVertex.appendDecl(glslCaps, &vshaderTxt); |
| 309 vshaderTxt.append(";"); | 309 vshaderTxt.append(";"); |
| 310 uTexCoordXform.appendDecl(glslCaps, &vshaderTxt); | 310 uTexCoordXform.appendDecl(glslCaps, &vshaderTxt); |
| 311 vshaderTxt.append(";"); | 311 vshaderTxt.append(";"); |
| 312 uPosXform.appendDecl(glslCaps, &vshaderTxt); | 312 uPosXform.appendDecl(glslCaps, &vshaderTxt); |
| 313 vshaderTxt.append(";"); | 313 vshaderTxt.append(";"); |
| 314 vTexCoord.appendDecl(glslCaps, &vshaderTxt); | 314 vTexCoord.appendDecl(glslCaps, &vshaderTxt); |
| 315 vshaderTxt.append(";"); | 315 vshaderTxt.append(";"); |
| 316 | 316 |
| 317 vshaderTxt.append( | 317 vshaderTxt.append( |
| 318 "// PLS Setup Program VS\n" | 318 "// PLS Setup Program VS\n" |
| 319 "void main() {" | 319 "void main() {" |
| 320 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" | 320 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" |
| 321 " gl_Position.zw = vec2(0, 1);" | 321 " gl_Position.zw = vec2(0, 1);" |
| 322 "}" | 322 "}" |
| 323 ); | 323 ); |
| 324 | 324 |
| 325 SkString fshaderTxt(version); | 325 SkString fshaderTxt(version); |
| 326 if (glslCaps->noperspectiveInterpolationSupport()) { | 326 if (glslCaps->noperspectiveInterpolationSupport()) { |
| (...skipping 2287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2614 } else { | 2614 } else { |
| 2615 dst -= rowBytes; | 2615 dst -= rowBytes; |
| 2616 } | 2616 } |
| 2617 } | 2617 } |
| 2618 } | 2618 } |
| 2619 return true; | 2619 return true; |
| 2620 } | 2620 } |
| 2621 | 2621 |
| 2622 void GrGLGpu::finishDrawTarget() { | 2622 void GrGLGpu::finishDrawTarget() { |
| 2623 if (fPLSHasBeenUsed) { | 2623 if (fPLSHasBeenUsed) { |
| 2624 /* There is an ARM driver bug where if we use PLS, and then draw a frame
which does not | 2624 /* There is an ARM driver bug where if we use PLS, and then draw a frame
which does not |
| 2625 * use PLS, it leaves garbage all over the place. As a workaround, we us
e PLS in a | 2625 * use PLS, it leaves garbage all over the place. As a workaround, we us
e PLS in a |
| 2626 * trivial way every frame. And since we use it every frame, there's nev
er a point at which | 2626 * trivial way every frame. And since we use it every frame, there's nev
er a point at which |
| 2627 * it becomes safe to stop using this workaround once we start. | 2627 * it becomes safe to stop using this workaround once we start. |
| 2628 */ | 2628 */ |
| 2629 this->disableScissor(); | 2629 this->disableScissor(); |
| 2630 // using PLS in the presence of MSAA results in GL_INVALID_OPERATION | 2630 // using PLS in the presence of MSAA results in GL_INVALID_OPERATION |
| 2631 this->flushHWAAState(nullptr, false, false); | 2631 this->flushHWAAState(nullptr, false, false); |
| 2632 SkASSERT(!fHWPLSEnabled); | 2632 SkASSERT(!fHWPLSEnabled); |
| 2633 SkASSERT(fMSAAEnabled != kYes_TriState); | 2633 SkASSERT(fMSAAEnabled != kYes_TriState); |
| 2634 GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); | 2634 GL_CALL(Enable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); |
| 2635 this->stampRectUsingProgram(fPLSSetupProgram.fProgram, | 2635 this->stampRectUsingProgram(fPLSSetupProgram.fProgram, |
| 2636 SkRect::MakeXYWH(-100.0f, -100.0f, 0.01f, 0.
01f), | 2636 SkRect::MakeXYWH(-100.0f, -100.0f, 0.01f, 0.
01f), |
| 2637 fPLSSetupProgram.fPosXformUniform, | 2637 fPLSSetupProgram.fPosXformUniform, |
| 2638 fPLSSetupProgram.fArrayBuffer); | 2638 fPLSSetupProgram.fArrayBuffer); |
| 2639 GL_CALL(Disable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); | 2639 GL_CALL(Disable(GR_GL_SHADER_PIXEL_LOCAL_STORAGE)); |
| 2640 } | 2640 } |
| 2641 } | 2641 } |
| 2642 | 2642 |
| 2643 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bounds,
bool disableSRGB) { | 2643 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bounds,
bool disableSRGB) { |
| 2644 SkASSERT(target); | 2644 SkASSERT(target); |
| 2645 | 2645 |
| 2646 uint32_t rtID = target->getUniqueID(); | 2646 uint32_t rtID = target->getUniqueID(); |
| 2647 if (fHWBoundRenderTargetUniqueID != rtID) { | 2647 if (fHWBoundRenderTargetUniqueID != rtID) { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2796 int set_a_break_pt_here = 9; | 2796 int set_a_break_pt_here = 9; |
| 2797 aglSwapBuffers(aglGetCurrentContext()); | 2797 aglSwapBuffers(aglGetCurrentContext()); |
| 2798 #elif defined(SK_BUILD_FOR_WIN32) | 2798 #elif defined(SK_BUILD_FOR_WIN32) |
| 2799 SwapBuf(); | 2799 SwapBuf(); |
| 2800 int set_a_break_pt_here = 9; | 2800 int set_a_break_pt_here = 9; |
| 2801 SwapBuf(); | 2801 SwapBuf(); |
| 2802 #endif | 2802 #endif |
| 2803 #endif | 2803 #endif |
| 2804 } | 2804 } |
| 2805 | 2805 |
| 2806 void GrGLGpu::stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGL
int posXformUniform, | 2806 void GrGLGpu::stampRectUsingProgram(GrGLuint program, const SkRect& bounds, GrGL
int posXformUniform, |
| 2807 GrGLuint arrayBuffer) { | 2807 GrGLuint arrayBuffer) { |
| 2808 GL_CALL(UseProgram(program)); | 2808 GL_CALL(UseProgram(program)); |
| 2809 this->fHWGeometryState.setVertexArrayID(this, 0); | 2809 this->fHWGeometryState.setVertexArrayID(this, 0); |
| 2810 | 2810 |
| 2811 GrGLAttribArrayState* attribs = | 2811 GrGLAttribArrayState* attribs = |
| 2812 this->fHWGeometryState.bindArrayAndBufferToDraw(this, arrayBuffer); | 2812 this->fHWGeometryState.bindArrayAndBufferToDraw(this, arrayBuffer); |
| 2813 attribs->set(this, 0, arrayBuffer, kVec2f_GrVertexAttribType, 2 * sizeof(GrG
Lfloat), 0); | 2813 attribs->set(this, 0, arrayBuffer, kVec2f_GrVertexAttribType, 2 * sizeof(GrG
Lfloat), 0); |
| 2814 attribs->disableUnusedArrays(this, 0x1); | 2814 attribs->disableUnusedArrays(this, 0x1); |
| 2815 | 2815 |
| 2816 GL_CALL(Uniform4f(posXformUniform, bounds.width(), bounds.height(), bounds.l
eft(), | 2816 GL_CALL(Uniform4f(posXformUniform, bounds.width(), bounds.height(), bounds.l
eft(), |
| 2817 bounds.top())); | 2817 bounds.top())); |
| 2818 | 2818 |
| 2819 GrXferProcessor::BlendInfo blendInfo; | 2819 GrXferProcessor::BlendInfo blendInfo; |
| 2820 blendInfo.reset(); | 2820 blendInfo.reset(); |
| 2821 this->flushBlend(blendInfo, GrSwizzle()); | 2821 this->flushBlend(blendInfo, GrSwizzle()); |
| 2822 this->flushColorWrite(true); | 2822 this->flushColorWrite(true); |
| 2823 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); | 2823 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); |
| 2824 if (!fHWStencilSettings.isDisabled()) { | 2824 if (!fHWStencilSettings.isDisabled()) { |
| 2825 GL_CALL(Disable(GR_GL_STENCIL_TEST)); | 2825 GL_CALL(Disable(GR_GL_STENCIL_TEST)); |
| 2826 } | 2826 } |
| 2827 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); | 2827 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); |
| 2828 GL_CALL(UseProgram(fHWProgramID)); | 2828 GL_CALL(UseProgram(fHWProgramID)); |
| 2829 if (!fHWStencilSettings.isDisabled()) { | 2829 if (!fHWStencilSettings.isDisabled()) { |
| 2830 GL_CALL(Enable(GR_GL_STENCIL_TEST)); | 2830 GL_CALL(Enable(GR_GL_STENCIL_TEST)); |
| 2831 } | 2831 } |
| 2832 } | 2832 } |
| 2833 | 2833 |
| 2834 void GrGLGpu::setupPixelLocalStorage(const GrPipeline& pipeline, | 2834 void GrGLGpu::setupPixelLocalStorage(const GrPipeline& pipeline, |
| 2835 const GrPrimitiveProcessor& primProc) { | 2835 const GrPrimitiveProcessor& primProc) { |
| 2836 fPLSHasBeenUsed = true; | 2836 fPLSHasBeenUsed = true; |
| 2837 const SkRect& bounds = | 2837 const SkRect& bounds = |
| 2838 static_cast<const GrPLSGeometryProcessor&>(primProc).getBounds(); | 2838 static_cast<const GrPLSGeometryProcessor&>(primProc).getBounds(); |
| 2839 // setup pixel local storage -- this means capturing and storing the current
framebuffer color | 2839 // setup pixel local storage -- this means capturing and storing the current
framebuffer color |
| 2840 // and initializing the winding counts to zero | 2840 // and initializing the winding counts to zero |
| 2841 GrRenderTarget* rt = pipeline.getRenderTarget(); | 2841 GrRenderTarget* rt = pipeline.getRenderTarget(); |
| 2842 SkScalar width = SkIntToScalar(rt->width()); | 2842 SkScalar width = SkIntToScalar(rt->width()); |
| 2843 SkScalar height = SkIntToScalar(rt->height()); | 2843 SkScalar height = SkIntToScalar(rt->height()); |
| 2844 // dst rect edges in NDC (-1 to 1) | 2844 // dst rect edges in NDC (-1 to 1) |
| 2845 // having some issues with rounding, just expand the bounds by 1 and trust t
he scissor to keep | 2845 // having some issues with rounding, just expand the bounds by 1 and trust t
he scissor to keep |
| 2846 // it contained properly | 2846 // it contained properly |
| 2847 GrGLfloat dx0 = 2.0f * (bounds.left() - 1) / width - 1.0f; | 2847 GrGLfloat dx0 = 2.0f * (bounds.left() - 1) / width - 1.0f; |
| 2848 GrGLfloat dx1 = 2.0f * (bounds.right() + 1) / width - 1.0f; | 2848 GrGLfloat dx1 = 2.0f * (bounds.right() + 1) / width - 1.0f; |
| 2849 GrGLfloat dy0 = -2.0f * (bounds.top() - 1) / height + 1.0f; | 2849 GrGLfloat dy0 = -2.0f * (bounds.top() - 1) / height + 1.0f; |
| 2850 GrGLfloat dy1 = -2.0f * (bounds.bottom() + 1) / height + 1.0f; | 2850 GrGLfloat dy1 = -2.0f * (bounds.bottom() + 1) / height + 1.0f; |
| 2851 SkRect deviceBounds = SkRect::MakeXYWH(dx0, dy0, dx1 - dx0, dy1 - dy0); | 2851 SkRect deviceBounds = SkRect::MakeXYWH(dx0, dy0, dx1 - dx0, dy1 - dy0); |
| 2852 | 2852 |
| 2853 GL_CALL(Enable(GR_GL_FETCH_PER_SAMPLE_ARM)); | 2853 GL_CALL(Enable(GR_GL_FETCH_PER_SAMPLE_ARM)); |
| 2854 this->stampRectUsingProgram(fPLSSetupProgram.fProgram, deviceBounds, | 2854 this->stampRectUsingProgram(fPLSSetupProgram.fProgram, deviceBounds, |
| 2855 fPLSSetupProgram.fPosXformUniform, fPLSSetupProg
ram.fArrayBuffer); | 2855 fPLSSetupProgram.fPosXformUniform, fPLSSetupProg
ram.fArrayBuffer); |
| 2856 } | 2856 } |
| 2857 | 2857 |
| 2858 void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) { | 2858 void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) { |
| 2859 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); | 2859 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); |
| 2860 if (rt->needsResolve()) { | 2860 if (rt->needsResolve()) { |
| 2861 // Some extensions automatically resolves the texture when it is read. | 2861 // Some extensions automatically resolves the texture when it is read. |
| 2862 if (this->glCaps().usesMSAARenderBuffers()) { | 2862 if (this->glCaps().usesMSAARenderBuffers()) { |
| 2863 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); | 2863 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); |
| 2864 fStats.incRenderTargetBinds(); | 2864 fStats.incRenderTargetBinds(); |
| (...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4224 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || | 4224 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || |
| 4225 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { | 4225 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { |
| 4226 copyParams->fFilter = GrTextureParams::kNone_FilterMode; | 4226 copyParams->fFilter = GrTextureParams::kNone_FilterMode; |
| 4227 copyParams->fWidth = texture->width(); | 4227 copyParams->fWidth = texture->width(); |
| 4228 copyParams->fHeight = texture->height(); | 4228 copyParams->fHeight = texture->height(); |
| 4229 return true; | 4229 return true; |
| 4230 } | 4230 } |
| 4231 } | 4231 } |
| 4232 return false; | 4232 return false; |
| 4233 } | 4233 } |
| OLD | NEW |