Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(852)

Side by Side Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1673923003: Revert of skia: Add support for CHROMIUM_image backed textures. (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/gl/GrGLGpu.h ('k') | src/gpu/gl/GrGLTexture.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 808 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE)); 819 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE));
820 } 820 }
821 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig) )); 821 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig) ));
822 } 822 }
823 bool succeeded = true; 823 bool succeeded = true;
824 if (kNewTexture_UploadType == uploadType) { 824 if (kNewTexture_UploadType == uploadType) {
825 if (dataOrOffset && 825 if (dataOrOffset &&
826 !(0 == left && 0 == top && desc.fWidth == width && desc.fHeight == h eight)) { 826 !(0 == left && 0 == top && desc.fWidth == width && desc.fHeight == h eight)) {
827 succeeded = false; 827 succeeded = false;
828 } else { 828 } else {
829 if (desc.fTextureStorageAllocator.fAllocateTextureStorage) { 829 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
830 if (dataOrOffset) { 830 GL_ALLOC_CALL(this->glInterface(), TexImage2D(target, 0, internalFor mat, desc.fWidth,
831 GL_CALL(TexSubImage2D(target, 831 desc.fHeight, 0, exter nalFormat,
832 0, // level 832 externalType, dataOrOf fset));
833 left, top, 833 GrGLenum error = check_alloc_error(desc, this->glInterface());
834 width, height, 834 if (error != GR_GL_NO_ERROR) {
835 externalFormat, externalType, dataOrOf fset)); 835 succeeded = false;
836 } 836 }
837 } else {
838 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
839 GL_ALLOC_CALL(this->glInterface(), TexImage2D(
840 target, 0, internalFormat, desc.fWidth, desc.fHeight, 0, ext ernalFormat,
841 externalType, dataOrOffset));
842 GrGLenum error = check_alloc_error(desc, this->glInterface());
843 if (error != GR_GL_NO_ERROR) {
844 succeeded = false;
845 }
846 }
847 } 837 }
848 } else { 838 } else {
849 if (swFlipY || glFlipY) { 839 if (swFlipY || glFlipY) {
850 top = desc.fHeight - (top + height); 840 top = desc.fHeight - (top + height);
851 } 841 }
852 GL_CALL(TexSubImage2D(target, 842 GL_CALL(TexSubImage2D(target,
853 0, // level 843 0, // level
854 left, top, 844 left, top,
855 width, height, 845 width, height,
856 externalFormat, externalType, dataOrOffset)); 846 externalFormat, externalType, dataOrOffset));
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 const void* srcData, size_t rowBytes) { 1095 const void* srcData, size_t rowBytes) {
1106 // We fail if the MSAA was requested and is not available. 1096 // We fail if the MSAA was requested and is not available.
1107 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC nt) { 1097 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC nt) {
1108 //SkDebugf("MSAA RT requested but not supported on this platform."); 1098 //SkDebugf("MSAA RT requested but not supported on this platform.");
1109 return return_null_texture(); 1099 return return_null_texture();
1110 } 1100 }
1111 1101
1112 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); 1102 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag);
1113 1103
1114 GrGLTexture::IDDesc idDesc; 1104 GrGLTexture::IDDesc idDesc;
1105 idDesc.fInfo.fID = 0;
1106 GL_CALL(GenTextures(1, &idDesc.fInfo.fID));
1115 idDesc.fLifeCycle = lifeCycle; 1107 idDesc.fLifeCycle = lifeCycle;
1116 GrGLTexture::TexParams initialTexParams; 1108 // We only support GL_TEXTURE_2D at the moment.
1117 if (!this->createTextureImpl(desc, &idDesc.fInfo, renderTarget, srcData, 1109 idDesc.fInfo.fTarget = GR_GL_TEXTURE_2D;
1118 &initialTexParams, rowBytes)) { 1110
1111 if (!idDesc.fInfo.fID) {
1119 return return_null_texture(); 1112 return return_null_texture();
1120 } 1113 }
1121 1114
1115 this->setScratchTextureUnit();
1116 GL_CALL(BindTexture(idDesc.fInfo.fTarget, idDesc.fInfo.fID));
1117
1118 if (renderTarget && this->glCaps().textureUsageSupport()) {
1119 // provides a hint about how this texture will be used
1120 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1121 GR_GL_TEXTURE_USAGE,
1122 GR_GL_FRAMEBUFFER_ATTACHMENT));
1123 }
1124
1125 // Some drivers like to know filter/wrap before seeing glTexImage2D. Some
1126 // drivers have a bug where an FBO won't be complete if it includes a
1127 // texture that is not mipmap complete (considering the filter in use).
1128 GrGLTexture::TexParams initialTexParams;
1129 // we only set a subset here so invalidate first
1130 initialTexParams.invalidate();
1131 initialTexParams.fMinFilter = GR_GL_NEAREST;
1132 initialTexParams.fMagFilter = GR_GL_NEAREST;
1133 initialTexParams.fWrapS = GR_GL_CLAMP_TO_EDGE;
1134 initialTexParams.fWrapT = GR_GL_CLAMP_TO_EDGE;
1135 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1136 GR_GL_TEXTURE_MAG_FILTER,
1137 initialTexParams.fMagFilter));
1138 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1139 GR_GL_TEXTURE_MIN_FILTER,
1140 initialTexParams.fMinFilter));
1141 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1142 GR_GL_TEXTURE_WRAP_S,
1143 initialTexParams.fWrapS));
1144 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1145 GR_GL_TEXTURE_WRAP_T,
1146 initialTexParams.fWrapT));
1147 if (!this->uploadTexData(desc, idDesc.fInfo.fTarget, kNewTexture_UploadType, 0, 0,
1148 desc.fWidth, desc.fHeight,
1149 desc.fConfig, srcData, rowBytes)) {
1150 GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID));
1151 return return_null_texture();
1152 }
1153
1122 GrGLTexture* tex; 1154 GrGLTexture* tex;
1123 if (renderTarget) { 1155 if (renderTarget) {
1124 // unbind the texture from the texture unit before binding it to the fra me buffer 1156 // unbind the texture from the texture unit before binding it to the fra me buffer
1125 GL_CALL(BindTexture(idDesc.fInfo.fTarget, 0)); 1157 GL_CALL(BindTexture(idDesc.fInfo.fTarget, 0));
1126 GrGLRenderTarget::IDDesc rtIDDesc; 1158 GrGLRenderTarget::IDDesc rtIDDesc;
1127 1159
1128 if (!this->createRenderTargetObjects(desc, lifeCycle, idDesc.fInfo, &rtI DDesc)) { 1160 if (!this->createRenderTargetObjects(desc, lifeCycle, idDesc.fInfo, &rtI DDesc)) {
1129 GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID)); 1161 GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID));
1130 return return_null_texture(); 1162 return return_null_texture();
1131 } 1163 }
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 GL_CALL(DeleteRenderbuffers(1, &sbRBID)); 1363 GL_CALL(DeleteRenderbuffers(1, &sbRBID));
1332 } 1364 }
1333 GL_CALL(DeleteTextures(1, &colorID)); 1365 GL_CALL(DeleteTextures(1, &colorID));
1334 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, 0)); 1366 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, 0));
1335 GL_CALL(DeleteFramebuffers(1, &fb)); 1367 GL_CALL(DeleteFramebuffers(1, &fb));
1336 fGLContext->caps()->setStencilFormatIndexForConfig(config, firstWorkingS tencilFormatIndex); 1368 fGLContext->caps()->setStencilFormatIndexForConfig(config, firstWorkingS tencilFormatIndex);
1337 } 1369 }
1338 return this->glCaps().getStencilFormatIndexForConfig(config); 1370 return this->glCaps().getStencilFormatIndexForConfig(config);
1339 } 1371 }
1340 1372
1341 bool GrGLGpu::createTextureImpl(const GrSurfaceDesc& desc, GrGLTextureInfo* info ,
1342 bool renderTarget, const void* srcData,
1343 GrGLTexture::TexParams* initialTexParams, size_t rowBytes) {
1344 // Some drivers like to know filter/wrap before seeing glTexImage2D. Some
1345 // drivers have a bug where an FBO won't be complete if it includes a
1346 // texture that is not mipmap complete (considering the filter in use).
1347
1348 // we only set a subset here so invalidate first
1349 initialTexParams->invalidate();
1350 initialTexParams->fMinFilter = GR_GL_NEAREST;
1351 initialTexParams->fMagFilter = GR_GL_NEAREST;
1352 initialTexParams->fWrapS = GR_GL_CLAMP_TO_EDGE;
1353 initialTexParams->fWrapT = GR_GL_CLAMP_TO_EDGE;
1354
1355 if (desc.fTextureStorageAllocator.fAllocateTextureStorage) {
1356 return this->createTextureExternalAllocatorImpl(desc, info, srcData, row Bytes);
1357 }
1358
1359 info->fID = 0;
1360 info->fTarget = GR_GL_TEXTURE_2D;
1361 GL_CALL(GenTextures(1, &(info->fID)));
1362
1363 if (!info->fID) {
1364 return false;
1365 }
1366
1367 this->setScratchTextureUnit();
1368 GL_CALL(BindTexture(info->fTarget, info->fID));
1369
1370 if (renderTarget && this->glCaps().textureUsageSupport()) {
1371 // provides a hint about how this texture will be used
1372 GL_CALL(TexParameteri(info->fTarget,
1373 GR_GL_TEXTURE_USAGE,
1374 GR_GL_FRAMEBUFFER_ATTACHMENT));
1375 }
1376
1377 GL_CALL(TexParameteri(info->fTarget,
1378 GR_GL_TEXTURE_MAG_FILTER,
1379 initialTexParams->fMagFilter));
1380 GL_CALL(TexParameteri(info->fTarget,
1381 GR_GL_TEXTURE_MIN_FILTER,
1382 initialTexParams->fMinFilter));
1383 GL_CALL(TexParameteri(info->fTarget,
1384 GR_GL_TEXTURE_WRAP_S,
1385 initialTexParams->fWrapS));
1386 GL_CALL(TexParameteri(info->fTarget,
1387 GR_GL_TEXTURE_WRAP_T,
1388 initialTexParams->fWrapT));
1389 if (!this->uploadTexData(desc, info->fTarget, kNewTexture_UploadType, 0, 0,
1390 desc.fWidth, desc.fHeight,
1391 desc.fConfig, srcData, rowBytes)) {
1392 GL_CALL(DeleteTextures(1, &(info->fID)));
1393 return false;
1394 }
1395 return true;
1396 }
1397
1398 bool GrGLGpu::createTextureExternalAllocatorImpl(
1399 const GrSurfaceDesc& desc, GrGLTextureInfo* info, const void* srcData, s ize_t rowBytes) {
1400 switch (desc.fTextureStorageAllocator.fAllocateTextureStorage(
1401 desc.fTextureStorageAllocator.fCtx, reinterpret_cast<GrBacke ndObject>(info),
1402 desc.fWidth, desc.fHeight, desc.fConfig, srcData, desc.fOrig in)) {
1403 case GrTextureStorageAllocator::Result::kSucceededAndUploaded:
1404 return true;
1405 case GrTextureStorageAllocator::Result::kFailed:
1406 return false;
1407 case GrTextureStorageAllocator::Result::kSucceededWithoutUpload:
1408 break;
1409 }
1410
1411 if (!this->uploadTexData(desc, info->fTarget, kNewTexture_UploadType, 0, 0,
1412 desc.fWidth, desc.fHeight,
1413 desc.fConfig, srcData, rowBytes)) {
1414 desc.fTextureStorageAllocator.fDeallocateTextureStorage(
1415 desc.fTextureStorageAllocator.fCtx, reinterpret_cast<GrBackendOb ject>(info));
1416 return false;
1417 }
1418 return true;
1419 }
1420
1421 GrStencilAttachment* GrGLGpu::createStencilAttachmentForRenderTarget(const GrRen derTarget* rt, 1373 GrStencilAttachment* GrGLGpu::createStencilAttachmentForRenderTarget(const GrRen derTarget* rt,
1422 int width, 1374 int width,
1423 int height) { 1375 int height) {
1424 // All internally created RTs are also textures. We don't create 1376 // All internally created RTs are also textures. We don't create
1425 // SBs for a client's standalone RT (that is a RT that isn't also a texture) . 1377 // SBs for a client's standalone RT (that is a RT that isn't also a texture) .
1426 SkASSERT(rt->asTexture()); 1378 SkASSERT(rt->asTexture());
1427 SkASSERT(width >= rt->width()); 1379 SkASSERT(width >= rt->width());
1428 SkASSERT(height >= rt->height()); 1380 SkASSERT(height >= rt->height());
1429 1381
1430 int samples = rt->numStencilSamples(); 1382 int samples = rt->numStencilSamples();
(...skipping 2173 matching lines...) Expand 10 before | Expand all | Expand 10 after
3604 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || 3556 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() ||
3605 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { 3557 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) {
3606 copyParams->fFilter = GrTextureParams::kNone_FilterMode; 3558 copyParams->fFilter = GrTextureParams::kNone_FilterMode;
3607 copyParams->fWidth = texture->width(); 3559 copyParams->fWidth = texture->width();
3608 copyParams->fHeight = texture->height(); 3560 copyParams->fHeight = texture->height();
3609 return true; 3561 return true;
3610 } 3562 }
3611 } 3563 }
3612 return false; 3564 return false;
3613 } 3565 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLGpu.h ('k') | src/gpu/gl/GrGLTexture.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698