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 "GrGLStencilAttachment.h" | 10 #include "GrGLStencilAttachment.h" |
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 // glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); | 409 // glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); |
410 if (kDefault_GrSurfaceOrigin == desc.fOrigin) { | 410 if (kDefault_GrSurfaceOrigin == desc.fOrigin) { |
411 surfDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; | 411 surfDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; |
412 } else { | 412 } else { |
413 surfDesc.fOrigin = desc.fOrigin; | 413 surfDesc.fOrigin = desc.fOrigin; |
414 } | 414 } |
415 | 415 |
416 GrGLTexture* texture = NULL; | 416 GrGLTexture* texture = NULL; |
417 if (renderTarget) { | 417 if (renderTarget) { |
418 GrGLRenderTarget::IDDesc rtIDDesc; | 418 GrGLRenderTarget::IDDesc rtIDDesc; |
419 if (!this->createRenderTargetObjects(surfDesc, false, idDesc.fTextureID,
&rtIDDesc)) { | 419 if (!this->createRenderTargetObjects(surfDesc, GrGpuResource::kUncached_
LifeCycle, |
| 420 idDesc.fTextureID, &rtIDDesc)) { |
420 return NULL; | 421 return NULL; |
421 } | 422 } |
422 texture = SkNEW_ARGS(GrGLTextureRenderTarget, (this, surfDesc, idDesc, r
tIDDesc)); | 423 texture = SkNEW_ARGS(GrGLTextureRenderTarget, (this, surfDesc, idDesc, r
tIDDesc)); |
423 } else { | 424 } else { |
424 texture = SkNEW_ARGS(GrGLTexture, (this, surfDesc, idDesc)); | 425 texture = SkNEW_ARGS(GrGLTexture, (this, surfDesc, idDesc)); |
425 } | 426 } |
426 if (NULL == texture) { | 427 if (NULL == texture) { |
427 return NULL; | 428 return NULL; |
428 } | 429 } |
429 | 430 |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 format, | 805 format, |
805 width, height)); | 806 width, height)); |
806 break; | 807 break; |
807 case GrGLCaps::kNone_MSFBOType: | 808 case GrGLCaps::kNone_MSFBOType: |
808 SkFAIL("Shouldn't be here if we don't support multisampled renderbuf
fers."); | 809 SkFAIL("Shouldn't be here if we don't support multisampled renderbuf
fers."); |
809 break; | 810 break; |
810 } | 811 } |
811 return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface())); | 812 return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface())); |
812 } | 813 } |
813 | 814 |
814 bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, bool budgeted
, GrGLuint texID, | 815 bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, |
| 816 GrGpuResource::LifeCycle lifeCycle, |
| 817 GrGLuint texID, |
815 GrGLRenderTarget::IDDesc* idDesc) { | 818 GrGLRenderTarget::IDDesc* idDesc) { |
816 idDesc->fMSColorRenderbufferID = 0; | 819 idDesc->fMSColorRenderbufferID = 0; |
817 idDesc->fRTFBOID = 0; | 820 idDesc->fRTFBOID = 0; |
818 idDesc->fTexFBOID = 0; | 821 idDesc->fTexFBOID = 0; |
819 idDesc->fLifeCycle = budgeted ? GrGpuResource::kCached_LifeCycle : | 822 idDesc->fLifeCycle = lifeCycle; |
820 GrGpuResource::kUncached_LifeCycle; | |
821 | 823 |
822 GrGLenum status; | 824 GrGLenum status; |
823 | 825 |
824 GrGLenum msColorFormat = 0; // suppress warning | 826 GrGLenum msColorFormat = 0; // suppress warning |
825 | 827 |
826 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO
Type()) { | 828 if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBO
Type()) { |
827 goto FAILED; | 829 goto FAILED; |
828 } | 830 } |
829 | 831 |
830 GL_CALL(GenFramebuffers(1, &idDesc->fTexFBOID)); | 832 GL_CALL(GenFramebuffers(1, &idDesc->fTexFBOID)); |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 // SkDEBUGFAIL("null texture"); | 925 // SkDEBUGFAIL("null texture"); |
924 return NULL; | 926 return NULL; |
925 } | 927 } |
926 | 928 |
927 #if 0 && defined(SK_DEBUG) | 929 #if 0 && defined(SK_DEBUG) |
928 static size_t as_size_t(int x) { | 930 static size_t as_size_t(int x) { |
929 return x; | 931 return x; |
930 } | 932 } |
931 #endif | 933 #endif |
932 | 934 |
933 GrTexture* GrGLGpu::onCreateTexture(const GrSurfaceDesc& origDesc, bool budgeted
, | 935 GrTexture* GrGLGpu::onCreateTexture(const GrSurfaceDesc& desc, |
| 936 GrGpuResource::LifeCycle lifeCycle, |
934 const void* srcData, size_t rowBytes) { | 937 const void* srcData, size_t rowBytes) { |
935 | |
936 GrSurfaceDesc desc = origDesc; | |
937 | |
938 // Attempt to catch un- or wrongly initialized sample counts; | |
939 SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); | |
940 // We fail if the MSAA was requested and is not available. | 938 // We fail if the MSAA was requested and is not available. |
941 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { | 939 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { |
942 //SkDebugf("MSAA RT requested but not supported on this platform."); | 940 //SkDebugf("MSAA RT requested but not supported on this platform."); |
943 return return_null_texture(); | 941 return return_null_texture(); |
944 } | 942 } |
945 | 943 |
946 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); | 944 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); |
947 | 945 |
948 // If the sample count exceeds the max then we clamp it. | |
949 desc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount()); | |
950 desc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); | |
951 | |
952 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { | |
953 //SkDebugf("MSAA RT requested but not supported on this platform."); | |
954 return return_null_texture(); | |
955 } | |
956 | |
957 if (renderTarget) { | |
958 int maxRTSize = this->caps()->maxRenderTargetSize(); | |
959 if (desc.fWidth > maxRTSize || desc.fHeight > maxRTSize) { | |
960 return return_null_texture(); | |
961 } | |
962 } else { | |
963 int maxSize = this->caps()->maxTextureSize(); | |
964 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { | |
965 return return_null_texture(); | |
966 } | |
967 } | |
968 | |
969 GrGLTexture::IDDesc idDesc; | 946 GrGLTexture::IDDesc idDesc; |
970 GL_CALL(GenTextures(1, &idDesc.fTextureID)); | 947 GL_CALL(GenTextures(1, &idDesc.fTextureID)); |
971 idDesc.fLifeCycle = budgeted ? GrGpuResource::kCached_LifeCycle : | 948 idDesc.fLifeCycle = lifeCycle; |
972 GrGpuResource::kUncached_LifeCycle; | |
973 | 949 |
974 if (!idDesc.fTextureID) { | 950 if (!idDesc.fTextureID) { |
975 return return_null_texture(); | 951 return return_null_texture(); |
976 } | 952 } |
977 | 953 |
978 this->setScratchTextureUnit(); | 954 this->setScratchTextureUnit(); |
979 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, idDesc.fTextureID)); | 955 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, idDesc.fTextureID)); |
980 | 956 |
981 if (renderTarget && this->glCaps().textureUsageSupport()) { | 957 if (renderTarget && this->glCaps().textureUsageSupport()) { |
982 // provides a hint about how this texture will be used | 958 // provides a hint about how this texture will be used |
(...skipping 30 matching lines...) Expand all Loading... |
1013 GL_CALL(DeleteTextures(1, &idDesc.fTextureID)); | 989 GL_CALL(DeleteTextures(1, &idDesc.fTextureID)); |
1014 return return_null_texture(); | 990 return return_null_texture(); |
1015 } | 991 } |
1016 | 992 |
1017 GrGLTexture* tex; | 993 GrGLTexture* tex; |
1018 if (renderTarget) { | 994 if (renderTarget) { |
1019 // unbind the texture from the texture unit before binding it to the fra
me buffer | 995 // unbind the texture from the texture unit before binding it to the fra
me buffer |
1020 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, 0)); | 996 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, 0)); |
1021 GrGLRenderTarget::IDDesc rtIDDesc; | 997 GrGLRenderTarget::IDDesc rtIDDesc; |
1022 | 998 |
1023 if (!this->createRenderTargetObjects(desc, budgeted, idDesc.fTextureID,
&rtIDDesc)) { | 999 if (!this->createRenderTargetObjects(desc, lifeCycle, idDesc.fTextureID,
&rtIDDesc)) { |
1024 GL_CALL(DeleteTextures(1, &idDesc.fTextureID)); | 1000 GL_CALL(DeleteTextures(1, &idDesc.fTextureID)); |
1025 return return_null_texture(); | 1001 return return_null_texture(); |
1026 } | 1002 } |
1027 tex = SkNEW_ARGS(GrGLTextureRenderTarget, (this, desc, idDesc, rtIDDesc)
); | 1003 tex = SkNEW_ARGS(GrGLTextureRenderTarget, (this, desc, idDesc, rtIDDesc)
); |
1028 } else { | 1004 } else { |
1029 tex = SkNEW_ARGS(GrGLTexture, (this, desc, idDesc)); | 1005 tex = SkNEW_ARGS(GrGLTexture, (this, desc, idDesc)); |
1030 } | 1006 } |
1031 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); | 1007 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); |
1032 #ifdef TRACE_TEXTURE_CREATION | 1008 #ifdef TRACE_TEXTURE_CREATION |
1033 SkDebugf("--- new texture [%d] size=(%d %d) config=%d\n", | 1009 SkDebugf("--- new texture [%d] size=(%d %d) config=%d\n", |
1034 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig); | 1010 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig); |
1035 #endif | 1011 #endif |
1036 return tex; | 1012 return tex; |
1037 } | 1013 } |
1038 | 1014 |
1039 GrTexture* GrGLGpu::onCreateCompressedTexture(const GrSurfaceDesc& origDesc, boo
l budgeted, | 1015 GrTexture* GrGLGpu::onCreateCompressedTexture(const GrSurfaceDesc& desc, |
| 1016 GrGpuResource::LifeCycle lifeCycle
, |
1040 const void* srcData) { | 1017 const void* srcData) { |
1041 | |
1042 if(SkToBool(origDesc.fFlags & kRenderTarget_GrSurfaceFlag) || origDesc.fSamp
leCnt > 0) { | |
1043 return return_null_texture(); | |
1044 } | |
1045 | |
1046 // Make sure that we're not flipping Y. | 1018 // Make sure that we're not flipping Y. |
1047 GrSurfaceOrigin texOrigin = resolve_origin(origDesc.fOrigin, false); | 1019 if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) { |
1048 if (kBottomLeft_GrSurfaceOrigin == texOrigin) { | |
1049 return return_null_texture(); | |
1050 } | |
1051 GrSurfaceDesc desc = origDesc; | |
1052 desc.fOrigin = texOrigin; | |
1053 | |
1054 int maxSize = this->caps()->maxTextureSize(); | |
1055 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { | |
1056 return return_null_texture(); | 1020 return return_null_texture(); |
1057 } | 1021 } |
1058 | 1022 |
1059 GrGLTexture::IDDesc idDesc; | 1023 GrGLTexture::IDDesc idDesc; |
1060 GL_CALL(GenTextures(1, &idDesc.fTextureID)); | 1024 GL_CALL(GenTextures(1, &idDesc.fTextureID)); |
1061 idDesc.fLifeCycle = budgeted ? GrGpuResource::kCached_LifeCycle : | 1025 idDesc.fLifeCycle = lifeCycle; |
1062 GrGpuResource::kUncached_LifeCycle; | |
1063 | 1026 |
1064 if (!idDesc.fTextureID) { | 1027 if (!idDesc.fTextureID) { |
1065 return return_null_texture(); | 1028 return return_null_texture(); |
1066 } | 1029 } |
1067 | 1030 |
1068 this->setScratchTextureUnit(); | 1031 this->setScratchTextureUnit(); |
1069 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, idDesc.fTextureID)); | 1032 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, idDesc.fTextureID)); |
1070 | 1033 |
1071 // Some drivers like to know filter/wrap before seeing glTexImage2D. Some | 1034 // Some drivers like to know filter/wrap before seeing glTexImage2D. Some |
1072 // drivers have a bug where an FBO won't be complete if it includes a | 1035 // drivers have a bug where an FBO won't be complete if it includes a |
(...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2816 this->setVertexArrayID(gpu, 0); | 2779 this->setVertexArrayID(gpu, 0); |
2817 } | 2780 } |
2818 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2781 int attrCount = gpu->glCaps().maxVertexAttributes(); |
2819 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2782 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
2820 fDefaultVertexArrayAttribState.resize(attrCount); | 2783 fDefaultVertexArrayAttribState.resize(attrCount); |
2821 } | 2784 } |
2822 attribState = &fDefaultVertexArrayAttribState; | 2785 attribState = &fDefaultVertexArrayAttribState; |
2823 } | 2786 } |
2824 return attribState; | 2787 return attribState; |
2825 } | 2788 } |
OLD | NEW |