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 | 8 |
9 #include "GrGLGpu.h" | 9 #include "GrGLGpu.h" |
10 #include "GrGLGLSL.h" | 10 #include "GrGLGLSL.h" |
(...skipping 1552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1563 return false; | 1563 return false; |
1564 } | 1564 } |
1565 | 1565 |
1566 GrGLuint programID = program->programID(); | 1566 GrGLuint programID = program->programID(); |
1567 if (fHWProgramID != programID) { | 1567 if (fHWProgramID != programID) { |
1568 GL_CALL(UseProgram(programID)); | 1568 GL_CALL(UseProgram(programID)); |
1569 fHWProgramID = programID; | 1569 fHWProgramID = programID; |
1570 } | 1570 } |
1571 | 1571 |
1572 if (blendInfo.fWriteColor) { | 1572 if (blendInfo.fWriteColor) { |
1573 this->flushBlend(blendInfo); | 1573 // Swizzle the blend to match what the shader will output. |
| 1574 const GrSwizzle& swizzle = this->glCaps().glslCaps()->configOutputSwizzl
e( |
| 1575 args.fPipeline->getRenderTarget()->config()); |
| 1576 this->flushBlend(blendInfo, swizzle); |
1574 } | 1577 } |
1575 | 1578 |
1576 SkSTArray<8, const GrTextureAccess*> textureAccesses; | 1579 SkSTArray<8, const GrTextureAccess*> textureAccesses; |
1577 program->setData(*args.fPrimitiveProcessor, pipeline, &textureAccesses); | 1580 program->setData(*args.fPrimitiveProcessor, pipeline, &textureAccesses); |
1578 | 1581 |
1579 int numTextureAccesses = textureAccesses.count(); | 1582 int numTextureAccesses = textureAccesses.count(); |
1580 for (int i = 0; i < numTextureAccesses; i++) { | 1583 for (int i = 0; i < numTextureAccesses; i++) { |
1581 this->bindTexture(i, textureAccesses[i]->getParams(), | 1584 this->bindTexture(i, textureAccesses[i]->getParams(), |
1582 static_cast<GrGLTexture*>(textureAccesses[i]->getTextu
re())); | 1585 static_cast<GrGLTexture*>(textureAccesses[i]->getTextu
re())); |
1583 } | 1586 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1643 reinterpret_cast<GrGLvoid*>(vertexOffsetInBytes + o
ffset)); | 1646 reinterpret_cast<GrGLvoid*>(vertexOffsetInBytes + o
ffset)); |
1644 offset += attrib.fOffset; | 1647 offset += attrib.fOffset; |
1645 } | 1648 } |
1646 attribState->disableUnusedArrays(this, usedAttribArraysMask); | 1649 attribState->disableUnusedArrays(this, usedAttribArraysMask); |
1647 } | 1650 } |
1648 } | 1651 } |
1649 | 1652 |
1650 void GrGLGpu::buildProgramDesc(GrProgramDesc* desc, | 1653 void GrGLGpu::buildProgramDesc(GrProgramDesc* desc, |
1651 const GrPrimitiveProcessor& primProc, | 1654 const GrPrimitiveProcessor& primProc, |
1652 const GrPipeline& pipeline) const { | 1655 const GrPipeline& pipeline) const { |
1653 if (!GrGLProgramDescBuilder::Build(desc, primProc, pipeline, this)) { | 1656 if (!GrGLProgramDescBuilder::Build(desc, primProc, pipeline, *this->glCaps()
.glslCaps())) { |
1654 SkDEBUGFAIL("Failed to generate GL program descriptor"); | 1657 SkDEBUGFAIL("Failed to generate GL program descriptor"); |
1655 } | 1658 } |
1656 } | 1659 } |
1657 | 1660 |
1658 void GrGLGpu::bindBuffer(GrGLuint id, GrGLenum type) { | 1661 void GrGLGpu::bindBuffer(GrGLuint id, GrGLenum type) { |
1659 this->handleDirtyContext(); | 1662 this->handleDirtyContext(); |
1660 if (GR_GL_ARRAY_BUFFER == type) { | 1663 if (GR_GL_ARRAY_BUFFER == type) { |
1661 this->bindVertexBuffer(id); | 1664 this->bindVertexBuffer(id); |
1662 } else if (GR_GL_ELEMENT_ARRAY_BUFFER == type) { | 1665 } else if (GR_GL_ELEMENT_ARRAY_BUFFER == type) { |
1663 this->bindIndexBufferAndDefaultVertexArray(id); | 1666 this->bindIndexBufferAndDefaultVertexArray(id); |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2388 } | 2391 } |
2389 } else { | 2392 } else { |
2390 if (kNo_TriState != fMSAAEnabled) { | 2393 if (kNo_TriState != fMSAAEnabled) { |
2391 GL_CALL(Disable(GR_GL_MULTISAMPLE)); | 2394 GL_CALL(Disable(GR_GL_MULTISAMPLE)); |
2392 fMSAAEnabled = kNo_TriState; | 2395 fMSAAEnabled = kNo_TriState; |
2393 } | 2396 } |
2394 } | 2397 } |
2395 } | 2398 } |
2396 } | 2399 } |
2397 | 2400 |
2398 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo) { | 2401 void GrGLGpu::flushBlend(const GrXferProcessor::BlendInfo& blendInfo, const GrSw
izzle& swizzle) { |
2399 // Any optimization to disable blending should have already been applied and | 2402 // Any optimization to disable blending should have already been applied and |
2400 // tweaked the equation to "add" or "subtract", and the coeffs to (1, 0). | 2403 // tweaked the equation to "add" or "subtract", and the coeffs to (1, 0). |
2401 | 2404 |
2402 GrBlendEquation equation = blendInfo.fEquation; | 2405 GrBlendEquation equation = blendInfo.fEquation; |
2403 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; | 2406 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; |
2404 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; | 2407 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; |
2405 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati
on == equation) && | 2408 bool blendOff = (kAdd_GrBlendEquation == equation || kSubtract_GrBlendEquati
on == equation) && |
2406 kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCo
eff; | 2409 kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCo
eff; |
2407 if (blendOff) { | 2410 if (blendOff) { |
2408 if (kNo_TriState != fHWBlendState.fEnabled) { | 2411 if (kNo_TriState != fHWBlendState.fEnabled) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2441 } | 2444 } |
2442 | 2445 |
2443 if (fHWBlendState.fSrcCoeff != srcCoeff || | 2446 if (fHWBlendState.fSrcCoeff != srcCoeff || |
2444 fHWBlendState.fDstCoeff != dstCoeff) { | 2447 fHWBlendState.fDstCoeff != dstCoeff) { |
2445 GL_CALL(BlendFunc(gXfermodeCoeff2Blend[srcCoeff], | 2448 GL_CALL(BlendFunc(gXfermodeCoeff2Blend[srcCoeff], |
2446 gXfermodeCoeff2Blend[dstCoeff])); | 2449 gXfermodeCoeff2Blend[dstCoeff])); |
2447 fHWBlendState.fSrcCoeff = srcCoeff; | 2450 fHWBlendState.fSrcCoeff = srcCoeff; |
2448 fHWBlendState.fDstCoeff = dstCoeff; | 2451 fHWBlendState.fDstCoeff = dstCoeff; |
2449 } | 2452 } |
2450 | 2453 |
2451 GrColor blendConst = blendInfo.fBlendConstant; | 2454 if ((BlendCoeffReferencesConstant(srcCoeff) || BlendCoeffReferencesConstant(
dstCoeff))) { |
2452 if ((BlendCoeffReferencesConstant(srcCoeff) || | 2455 GrColor blendConst = blendInfo.fBlendConstant; |
2453 BlendCoeffReferencesConstant(dstCoeff)) && | 2456 blendConst = swizzle.applyTo(blendConst); |
2454 (!fHWBlendState.fConstColorValid || fHWBlendState.fConstColor != blendCo
nst)) { | 2457 if (!fHWBlendState.fConstColorValid || fHWBlendState.fConstColor != blen
dConst) { |
2455 GrGLfloat c[4]; | 2458 GrGLfloat c[4]; |
2456 GrColorToRGBAFloat(blendConst, c); | 2459 GrColorToRGBAFloat(blendConst, c); |
2457 GL_CALL(BlendColor(c[0], c[1], c[2], c[3])); | 2460 GL_CALL(BlendColor(c[0], c[1], c[2], c[3])); |
2458 fHWBlendState.fConstColor = blendConst; | 2461 fHWBlendState.fConstColor = blendConst; |
2459 fHWBlendState.fConstColorValid = true; | 2462 fHWBlendState.fConstColorValid = true; |
| 2463 } |
2460 } | 2464 } |
2461 } | 2465 } |
2462 | 2466 |
2463 static inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) { | 2467 static inline GrGLenum tile_to_gl_wrap(SkShader::TileMode tm) { |
2464 static const GrGLenum gWrapModes[] = { | 2468 static const GrGLenum gWrapModes[] = { |
2465 GR_GL_CLAMP_TO_EDGE, | 2469 GR_GL_CLAMP_TO_EDGE, |
2466 GR_GL_REPEAT, | 2470 GR_GL_REPEAT, |
2467 GR_GL_MIRRORED_REPEAT | 2471 GR_GL_MIRRORED_REPEAT |
2468 }; | 2472 }; |
2469 GR_STATIC_ASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gWrapModes)); | 2473 GR_STATIC_ASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gWrapModes)); |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2833 desc->fConfig = src->config(); | 2837 desc->fConfig = src->config(); |
2834 desc->fOrigin = src->origin(); | 2838 desc->fOrigin = src->origin(); |
2835 desc->fFlags = kNone_GrSurfaceFlags; | 2839 desc->fFlags = kNone_GrSurfaceFlags; |
2836 return true; | 2840 return true; |
2837 } | 2841 } |
2838 | 2842 |
2839 bool GrGLGpu::onCopySurface(GrSurface* dst, | 2843 bool GrGLGpu::onCopySurface(GrSurface* dst, |
2840 GrSurface* src, | 2844 GrSurface* src, |
2841 const SkIRect& srcRect, | 2845 const SkIRect& srcRect, |
2842 const SkIPoint& dstPoint) { | 2846 const SkIPoint& dstPoint) { |
| 2847 // None of our copy methods can handle a swizzle. TODO: Make copySurfaceAsDr
aw handle the |
| 2848 // swizzle. |
| 2849 if (this->glCaps().glslCaps()->configOutputSwizzle(src->config()) != |
| 2850 this->glCaps().glslCaps()->configOutputSwizzle(dst->config())) { |
| 2851 return false; |
| 2852 } |
2843 if (src->asTexture() && dst->asRenderTarget()) { | 2853 if (src->asTexture() && dst->asRenderTarget()) { |
2844 this->copySurfaceAsDraw(dst, src, srcRect, dstPoint); | 2854 this->copySurfaceAsDraw(dst, src, srcRect, dstPoint); |
2845 return true; | 2855 return true; |
2846 } | 2856 } |
2847 | 2857 |
2848 if (can_copy_texsubimage(dst, src, this)) { | 2858 if (can_copy_texsubimage(dst, src, this)) { |
2849 this->copySurfaceAsCopyTexSubImage(dst, src, srcRect, dstPoint); | 2859 this->copySurfaceAsCopyTexSubImage(dst, src, srcRect, dstPoint); |
2850 return true; | 2860 return true; |
2851 } | 2861 } |
2852 | 2862 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3057 1, 0, | 3067 1, 0, |
3058 }; | 3068 }; |
3059 GL_ALLOC_CALL(this->glInterface(), | 3069 GL_ALLOC_CALL(this->glInterface(), |
3060 BufferData(GR_GL_ARRAY_BUFFER, | 3070 BufferData(GR_GL_ARRAY_BUFFER, |
3061 (GrGLsizeiptr) sizeof(vdata), | 3071 (GrGLsizeiptr) sizeof(vdata), |
3062 vdata, // data ptr | 3072 vdata, // data ptr |
3063 GR_GL_STATIC_DRAW)); | 3073 GR_GL_STATIC_DRAW)); |
3064 } | 3074 } |
3065 | 3075 |
3066 void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor
color) { | 3076 void GrGLGpu::drawDebugWireRect(GrRenderTarget* rt, const SkIRect& rect, GrColor
color) { |
| 3077 // TODO: This should swizzle the output to match dst's config, though it is
a debugging |
| 3078 // visualization. |
| 3079 |
3067 this->handleDirtyContext(); | 3080 this->handleDirtyContext(); |
3068 if (!fWireRectProgram.fProgram) { | 3081 if (!fWireRectProgram.fProgram) { |
3069 this->createWireRectProgram(); | 3082 this->createWireRectProgram(); |
3070 } | 3083 } |
3071 | 3084 |
3072 int w = rt->width(); | 3085 int w = rt->width(); |
3073 int h = rt->height(); | 3086 int h = rt->height(); |
3074 | 3087 |
3075 // Compute the edges of the rectangle (top,left,right,bottom) in NDC space.
Must consider | 3088 // Compute the edges of the rectangle (top,left,right,bottom) in NDC space.
Must consider |
3076 // whether the render target is flipped or not. | 3089 // whether the render target is flipped or not. |
(...skipping 30 matching lines...) Expand all Loading... |
3107 GrGLAttribArrayState* attribs = | 3120 GrGLAttribArrayState* attribs = |
3108 fHWGeometryState.bindArrayAndBufferToDraw(this, fWireRectArrayBuffer); | 3121 fHWGeometryState.bindArrayAndBufferToDraw(this, fWireRectArrayBuffer); |
3109 attribs->set(this, 0, fWireRectArrayBuffer, 2, GR_GL_FLOAT, false, 2 * sizeo
f(GrGLfloat), 0); | 3122 attribs->set(this, 0, fWireRectArrayBuffer, 2, GR_GL_FLOAT, false, 2 * sizeo
f(GrGLfloat), 0); |
3110 attribs->disableUnusedArrays(this, 0x1); | 3123 attribs->disableUnusedArrays(this, 0x1); |
3111 | 3124 |
3112 GL_CALL(Uniform4fv(fWireRectProgram.fRectUniform, 1, edges)); | 3125 GL_CALL(Uniform4fv(fWireRectProgram.fRectUniform, 1, edges)); |
3113 GL_CALL(Uniform4fv(fWireRectProgram.fColorUniform, 1, channels)); | 3126 GL_CALL(Uniform4fv(fWireRectProgram.fColorUniform, 1, channels)); |
3114 | 3127 |
3115 GrXferProcessor::BlendInfo blendInfo; | 3128 GrXferProcessor::BlendInfo blendInfo; |
3116 blendInfo.reset(); | 3129 blendInfo.reset(); |
3117 this->flushBlend(blendInfo); | 3130 this->flushBlend(blendInfo, GrSwizzle::RGBA()); |
3118 this->flushColorWrite(true); | 3131 this->flushColorWrite(true); |
3119 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); | 3132 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); |
3120 this->flushHWAAState(glRT, false); | 3133 this->flushHWAAState(glRT, false); |
3121 this->disableScissor(); | 3134 this->disableScissor(); |
3122 GrStencilSettings stencil; | 3135 GrStencilSettings stencil; |
3123 stencil.setDisabled(); | 3136 stencil.setDisabled(); |
3124 this->flushStencil(stencil); | 3137 this->flushStencil(stencil); |
3125 | 3138 |
3126 GL_CALL(DrawArrays(GR_GL_LINE_LOOP, 0, 4)); | 3139 GL_CALL(DrawArrays(GR_GL_LINE_LOOP, 0, 4)); |
3127 } | 3140 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3178 sy1 = 1.f - sy1; | 3191 sy1 = 1.f - sy1; |
3179 } | 3192 } |
3180 | 3193 |
3181 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fPosXformUniform, dx1 - dx0, dy1 -
dy0, dx0, dy0)); | 3194 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fPosXformUniform, dx1 - dx0, dy1 -
dy0, dx0, dy0)); |
3182 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fTexCoordXformUniform, | 3195 GL_CALL(Uniform4f(fCopyPrograms[progIdx].fTexCoordXformUniform, |
3183 sx1 - sx0, sy1 - sy0, sx0, sy0)); | 3196 sx1 - sx0, sy1 - sy0, sx0, sy0)); |
3184 GL_CALL(Uniform1i(fCopyPrograms[progIdx].fTextureUniform, 0)); | 3197 GL_CALL(Uniform1i(fCopyPrograms[progIdx].fTextureUniform, 0)); |
3185 | 3198 |
3186 GrXferProcessor::BlendInfo blendInfo; | 3199 GrXferProcessor::BlendInfo blendInfo; |
3187 blendInfo.reset(); | 3200 blendInfo.reset(); |
3188 this->flushBlend(blendInfo); | 3201 this->flushBlend(blendInfo, GrSwizzle::RGBA()); |
3189 this->flushColorWrite(true); | 3202 this->flushColorWrite(true); |
3190 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); | 3203 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); |
3191 this->flushHWAAState(dstRT, false); | 3204 this->flushHWAAState(dstRT, false); |
3192 this->disableScissor(); | 3205 this->disableScissor(); |
3193 GrStencilSettings stencil; | 3206 GrStencilSettings stencil; |
3194 stencil.setDisabled(); | 3207 stencil.setDisabled(); |
3195 this->flushStencil(stencil); | 3208 this->flushStencil(stencil); |
3196 | 3209 |
3197 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); | 3210 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); |
3198 } | 3211 } |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3444 this->setVertexArrayID(gpu, 0); | 3457 this->setVertexArrayID(gpu, 0); |
3445 } | 3458 } |
3446 int attrCount = gpu->glCaps().maxVertexAttributes(); | 3459 int attrCount = gpu->glCaps().maxVertexAttributes(); |
3447 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 3460 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
3448 fDefaultVertexArrayAttribState.resize(attrCount); | 3461 fDefaultVertexArrayAttribState.resize(attrCount); |
3449 } | 3462 } |
3450 attribState = &fDefaultVertexArrayAttribState; | 3463 attribState = &fDefaultVertexArrayAttribState; |
3451 } | 3464 } |
3452 return attribState; | 3465 return attribState; |
3453 } | 3466 } |
OLD | NEW |