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 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); | 518 idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); |
519 idDesc.fMSColorRenderbufferID = 0; | 519 idDesc.fMSColorRenderbufferID = 0; |
520 idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID; | 520 idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID; |
521 switch (ownership) { | 521 switch (ownership) { |
522 case kAdopt_GrWrapOwnership: | 522 case kAdopt_GrWrapOwnership: |
523 idDesc.fLifeCycle = GrGpuResource::kAdopted_LifeCycle; | 523 idDesc.fLifeCycle = GrGpuResource::kAdopted_LifeCycle; |
524 break; | 524 break; |
525 case kBorrow_GrWrapOwnership: | 525 case kBorrow_GrWrapOwnership: |
526 idDesc.fLifeCycle = GrGpuResource::kBorrowed_LifeCycle; | 526 idDesc.fLifeCycle = GrGpuResource::kBorrowed_LifeCycle; |
527 break; | 527 break; |
528 } | 528 } |
529 idDesc.fSampleConfig = GrRenderTarget::kUnified_SampleConfig; | 529 idDesc.fSampleConfig = GrRenderTarget::kUnified_SampleConfig; |
530 | 530 |
531 GrSurfaceDesc desc; | 531 GrSurfaceDesc desc; |
532 desc.fConfig = wrapDesc.fConfig; | 532 desc.fConfig = wrapDesc.fConfig; |
533 desc.fFlags = kCheckAllocation_GrSurfaceFlag | kRenderTarget_GrSurfaceFlag; | 533 desc.fFlags = kCheckAllocation_GrSurfaceFlag | kRenderTarget_GrSurfaceFlag; |
534 desc.fWidth = wrapDesc.fWidth; | 534 desc.fWidth = wrapDesc.fWidth; |
535 desc.fHeight = wrapDesc.fHeight; | 535 desc.fHeight = wrapDesc.fHeight; |
536 desc.fSampleCnt = SkTMin(wrapDesc.fSampleCnt, this->caps()->maxSampleCount()
); | 536 desc.fSampleCnt = SkTMin(wrapDesc.fSampleCnt, this->caps()->maxSampleCount()
); |
537 desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true); | 537 desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true); |
538 | 538 |
(...skipping 2243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2782 } | 2782 } |
2783 | 2783 |
2784 const GrGLTexture* dstTex = static_cast<const GrGLTexture*>(dst->asTexture()
); | 2784 const GrGLTexture* dstTex = static_cast<const GrGLTexture*>(dst->asTexture()
); |
2785 // CopyTex(Sub)Image writes to a texture and we have no way of dynamically w
rapping a RT in a | 2785 // CopyTex(Sub)Image writes to a texture and we have no way of dynamically w
rapping a RT in a |
2786 // texture. | 2786 // texture. |
2787 if (!dstTex) { | 2787 if (!dstTex) { |
2788 return false; | 2788 return false; |
2789 } | 2789 } |
2790 | 2790 |
2791 const GrGLTexture* srcTex = static_cast<const GrGLTexture*>(src->asTexture()
); | 2791 const GrGLTexture* srcTex = static_cast<const GrGLTexture*>(src->asTexture()
); |
2792 | 2792 |
2793 // Check that we could wrap the source in an FBO, that the dst is TEXTURE_2D
, that no mirroring | 2793 // Check that we could wrap the source in an FBO, that the dst is TEXTURE_2D
, that no mirroring |
2794 // is required. | 2794 // is required. |
2795 if (gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && | 2795 if (gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && |
2796 !GrPixelConfigIsCompressed(src->config()) && | 2796 !GrPixelConfigIsCompressed(src->config()) && |
2797 (!srcTex || srcTex->target() == GR_GL_TEXTURE_2D) && | 2797 (!srcTex || srcTex->target() == GR_GL_TEXTURE_2D) && |
2798 dstTex->target() == GR_GL_TEXTURE_2D && | 2798 dstTex->target() == GR_GL_TEXTURE_2D && |
2799 dst->origin() == src->origin()) { | 2799 dst->origin() == src->origin()) { |
2800 return true; | 2800 return true; |
2801 } else { | 2801 } else { |
2802 return false; | 2802 return false; |
(...skipping 28 matching lines...) Expand all Loading... |
2831 viewport->fWidth = surface->width(); | 2831 viewport->fWidth = surface->width(); |
2832 viewport->fHeight = surface->height(); | 2832 viewport->fHeight = surface->height(); |
2833 } else { | 2833 } else { |
2834 fStats.incRenderTargetBinds(); | 2834 fStats.incRenderTargetBinds(); |
2835 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); | 2835 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); |
2836 *viewport = rt->getViewport(); | 2836 *viewport = rt->getViewport(); |
2837 } | 2837 } |
2838 } | 2838 } |
2839 | 2839 |
2840 void GrGLGpu::unbindTextureFBOForCopy(GrGLenum fboTarget, GrSurface* surface) { | 2840 void GrGLGpu::unbindTextureFBOForCopy(GrGLenum fboTarget, GrSurface* surface) { |
2841 // bindSurfaceFBOForCopy temporarily binds textures that are not render targ
ets to | 2841 // bindSurfaceFBOForCopy temporarily binds textures that are not render targ
ets to |
2842 if (!surface->asRenderTarget()) { | 2842 if (!surface->asRenderTarget()) { |
2843 SkASSERT(surface->asTexture()); | 2843 SkASSERT(surface->asTexture()); |
2844 GrGLenum textureTarget = static_cast<GrGLTexture*>(surface->asTexture())
->target(); | 2844 GrGLenum textureTarget = static_cast<GrGLTexture*>(surface->asTexture())
->target(); |
2845 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, | 2845 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, |
2846 GR_GL_COLOR_ATTACHM
ENT0, | 2846 GR_GL_COLOR_ATTACHM
ENT0, |
2847 textureTarget, | 2847 textureTarget, |
2848 0, | 2848 0, |
2849 0)); | 2849 0)); |
2850 } | 2850 } |
2851 } | 2851 } |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2915 // None of our copy methods can handle a swizzle. TODO: Make copySurfaceAsDr
aw handle the | 2915 // None of our copy methods can handle a swizzle. TODO: Make copySurfaceAsDr
aw handle the |
2916 // swizzle. | 2916 // swizzle. |
2917 if (this->glCaps().glslCaps()->configOutputSwizzle(src->config()) != | 2917 if (this->glCaps().glslCaps()->configOutputSwizzle(src->config()) != |
2918 this->glCaps().glslCaps()->configOutputSwizzle(dst->config())) { | 2918 this->glCaps().glslCaps()->configOutputSwizzle(dst->config())) { |
2919 return false; | 2919 return false; |
2920 } | 2920 } |
2921 if (src->asTexture() && dst->asRenderTarget()) { | 2921 if (src->asTexture() && dst->asRenderTarget()) { |
2922 this->copySurfaceAsDraw(dst, src, srcRect, dstPoint); | 2922 this->copySurfaceAsDraw(dst, src, srcRect, dstPoint); |
2923 return true; | 2923 return true; |
2924 } | 2924 } |
2925 | 2925 |
2926 if (can_copy_texsubimage(dst, src, this)) { | 2926 if (can_copy_texsubimage(dst, src, this)) { |
2927 this->copySurfaceAsCopyTexSubImage(dst, src, srcRect, dstPoint); | 2927 this->copySurfaceAsCopyTexSubImage(dst, src, srcRect, dstPoint); |
2928 return true; | 2928 return true; |
2929 } | 2929 } |
2930 | 2930 |
2931 if (can_blit_framebuffer(dst, src, this)) { | 2931 if (can_blit_framebuffer(dst, src, this)) { |
2932 return this->copySurfaceAsBlitFramebuffer(dst, src, srcRect, dstPoint); | 2932 return this->copySurfaceAsBlitFramebuffer(dst, src, srcRect, dstPoint); |
2933 } | 2933 } |
2934 | 2934 |
2935 return false; | 2935 return false; |
(...skipping 30 matching lines...) Expand all Loading... |
2966 | 2966 |
2967 SkString vshaderTxt(version); | 2967 SkString vshaderTxt(version); |
2968 aVertex.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 2968 aVertex.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); |
2969 vshaderTxt.append(";"); | 2969 vshaderTxt.append(";"); |
2970 uTexCoordXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 2970 uTexCoordXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); |
2971 vshaderTxt.append(";"); | 2971 vshaderTxt.append(";"); |
2972 uPosXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 2972 uPosXform.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); |
2973 vshaderTxt.append(";"); | 2973 vshaderTxt.append(";"); |
2974 vTexCoord.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); | 2974 vTexCoord.appendDecl(this->glCaps().glslCaps(), &vshaderTxt); |
2975 vshaderTxt.append(";"); | 2975 vshaderTxt.append(";"); |
2976 | 2976 |
2977 vshaderTxt.append( | 2977 vshaderTxt.append( |
2978 "// Copy Program VS\n" | 2978 "// Copy Program VS\n" |
2979 "void main() {" | 2979 "void main() {" |
2980 " v_texCoord = a_vertex.xy * u_texCoordXform.xy + u_texCoordXform.z
w;" | 2980 " v_texCoord = a_vertex.xy * u_texCoordXform.xy + u_texCoordXform.z
w;" |
2981 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" | 2981 " gl_Position.xy = a_vertex * u_posXform.xy + u_posXform.zw;" |
2982 " gl_Position.zw = vec2(0, 1);" | 2982 " gl_Position.zw = vec2(0, 1);" |
2983 "}" | 2983 "}" |
2984 ); | 2984 ); |
2985 | 2985 |
2986 SkString fshaderTxt(version); | 2986 SkString fshaderTxt(version); |
(...skipping 18 matching lines...) Expand all Loading... |
3005 fsOutName = "gl_FragColor"; | 3005 fsOutName = "gl_FragColor"; |
3006 } | 3006 } |
3007 fshaderTxt.appendf( | 3007 fshaderTxt.appendf( |
3008 "// Copy Program FS\n" | 3008 "// Copy Program FS\n" |
3009 "void main() {" | 3009 "void main() {" |
3010 " %s = %s(u_texture, v_texCoord);" | 3010 " %s = %s(u_texture, v_texCoord);" |
3011 "}", | 3011 "}", |
3012 fsOutName, | 3012 fsOutName, |
3013 GrGLSLTexture2DFunctionName(kVec2f_GrSLType, kSamplerTypes[i], this-
>glslGeneration()) | 3013 GrGLSLTexture2DFunctionName(kVec2f_GrSLType, kSamplerTypes[i], this-
>glslGeneration()) |
3014 ); | 3014 ); |
3015 | 3015 |
3016 GL_CALL_RET(fCopyPrograms[i].fProgram, CreateProgram()); | 3016 GL_CALL_RET(fCopyPrograms[i].fProgram, CreateProgram()); |
3017 const char* str; | 3017 const char* str; |
3018 GrGLint length; | 3018 GrGLint length; |
3019 | 3019 |
3020 str = vshaderTxt.c_str(); | 3020 str = vshaderTxt.c_str(); |
3021 length = SkToInt(vshaderTxt.size()); | 3021 length = SkToInt(vshaderTxt.size()); |
3022 GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fCopyPrograms
[i].fProgram, | 3022 GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fCopyPrograms
[i].fProgram, |
3023 GR_GL_VERTEX_SHADER, &str,
&length, 1, | 3023 GR_GL_VERTEX_SHADER, &str,
&length, 1, |
3024 &fStats); | 3024 &fStats); |
3025 | 3025 |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3556 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || | 3556 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || |
3557 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { | 3557 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { |
3558 copyParams->fFilter = GrTextureParams::kNone_FilterMode; | 3558 copyParams->fFilter = GrTextureParams::kNone_FilterMode; |
3559 copyParams->fWidth = texture->width(); | 3559 copyParams->fWidth = texture->width(); |
3560 copyParams->fHeight = texture->height(); | 3560 copyParams->fHeight = texture->height(); |
3561 return true; | 3561 return true; |
3562 } | 3562 } |
3563 } | 3563 } |
3564 return false; | 3564 return false; |
3565 } | 3565 } |
OLD | NEW |