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

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

Issue 1623653002: skia: Add support for CHROMIUM_image backed textures. (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Add test. Created 4 years, 11 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
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 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 case kBorrow_GrWrapOwnership: 477 case kBorrow_GrWrapOwnership:
478 idDesc.fLifeCycle = GrGpuResource::kBorrowed_LifeCycle; 478 idDesc.fLifeCycle = GrGpuResource::kBorrowed_LifeCycle;
479 break; 479 break;
480 } 480 }
481 481
482 surfDesc.fFlags = (GrSurfaceFlags) desc.fFlags; 482 surfDesc.fFlags = (GrSurfaceFlags) desc.fFlags;
483 surfDesc.fWidth = desc.fWidth; 483 surfDesc.fWidth = desc.fWidth;
484 surfDesc.fHeight = desc.fHeight; 484 surfDesc.fHeight = desc.fHeight;
485 surfDesc.fConfig = desc.fConfig; 485 surfDesc.fConfig = desc.fConfig;
486 surfDesc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount() ); 486 surfDesc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount() );
487 surfDesc.fTextureStorageAllocator = desc.fTextureStorageAllocator;
487 // FIXME: this should be calling resolve_origin(), but Chrome code is curre ntly 488 // FIXME: this should be calling resolve_origin(), but Chrome code is curre ntly
488 // assuming the old behaviour, which is that backend textures are always 489 // assuming the old behaviour, which is that backend textures are always
489 // BottomLeft, even for non-RT's. Once Chrome is fixed, change this to: 490 // BottomLeft, even for non-RT's. Once Chrome is fixed, change this to:
490 // glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); 491 // glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget);
491 if (kDefault_GrSurfaceOrigin == desc.fOrigin) { 492 if (kDefault_GrSurfaceOrigin == desc.fOrigin) {
492 surfDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; 493 surfDesc.fOrigin = kBottomLeft_GrSurfaceOrigin;
493 } else { 494 } else {
494 surfDesc.fOrigin = desc.fOrigin; 495 surfDesc.fOrigin = desc.fOrigin;
495 } 496 }
496 497
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 this->setScratchTextureUnit(); 643 this->setScratchTextureUnit();
643 GL_CALL(BindTexture(glTex->target(), glTex->textureID())); 644 GL_CALL(BindTexture(glTex->target(), glTex->textureID()));
644 645
645 bool success = false; 646 bool success = false;
646 if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) { 647 if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) {
647 // We check that config == desc.fConfig in GrGLGpu::canWriteTexturePixel s() 648 // We check that config == desc.fConfig in GrGLGpu::canWriteTexturePixel s()
648 SkASSERT(config == glTex->desc().fConfig); 649 SkASSERT(config == glTex->desc().fConfig);
649 success = this->uploadCompressedTexData(glTex->desc(), glTex->target(), buffer, 650 success = this->uploadCompressedTexData(glTex->desc(), glTex->target(), buffer,
650 kWrite_UploadType, left, top, wi dth, height); 651 kWrite_UploadType, left, top, wi dth, height);
651 } else { 652 } else {
652 success = this->uploadTexData(glTex->desc(), glTex->target(), kWrite_Upl oadType, 653 success = this->uploadTexData(
653 left, top, width, height, config, buffer, rowBytes); 654 glTex->desc(),
655 reinterpret_cast<GrGLTextureInfo*>(glTex->getTextureHandle()),
656 kWrite_UploadType, left, top, width, height, config, buffer,
657 rowBytes);
654 } 658 }
655 659
656 if (success) { 660 if (success) {
657 glTex->texturePriv().dirtyMipMaps(true); 661 glTex->texturePriv().dirtyMipMaps(true);
658 return true; 662 return true;
659 } 663 }
660 664
661 return false; 665 return false;
662 } 666 }
663 667
(...skipping 16 matching lines...) Expand all
680 GL_CALL(BindTexture(glTex->target(), glTex->textureID())); 684 GL_CALL(BindTexture(glTex->target(), glTex->textureID()));
681 685
682 SkASSERT(!buffer->isMapped()); 686 SkASSERT(!buffer->isMapped());
683 GrGLTransferBuffer* glBuffer = reinterpret_cast<GrGLTransferBuffer*>(buffer) ; 687 GrGLTransferBuffer* glBuffer = reinterpret_cast<GrGLTransferBuffer*>(buffer) ;
684 // bind the transfer buffer 688 // bind the transfer buffer
685 SkASSERT(GR_GL_PIXEL_UNPACK_BUFFER == glBuffer->bufferType() || 689 SkASSERT(GR_GL_PIXEL_UNPACK_BUFFER == glBuffer->bufferType() ||
686 GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM == glBuffer->bufferType ()); 690 GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM == glBuffer->bufferType ());
687 GL_CALL(BindBuffer(glBuffer->bufferType(), glBuffer->bufferID())); 691 GL_CALL(BindBuffer(glBuffer->bufferType(), glBuffer->bufferID()));
688 692
689 bool success = false; 693 bool success = false;
690 success = this->uploadTexData(glTex->desc(), glTex->target(), kTransfer_Uplo adType, 694 success = this->uploadTexData(
691 left, top, width, height, config, buffer, rowB ytes); 695 glTex->desc(),
696 reinterpret_cast<GrGLTextureInfo*>(glTex->getTextureHandle()),
697 kTransfer_UploadType, left, top, width, height, config, buffer,
698 rowBytes);
692 699
693 if (success) { 700 if (success) {
694 glTex->texturePriv().dirtyMipMaps(true); 701 glTex->texturePriv().dirtyMipMaps(true);
695 return true; 702 return true;
696 } 703 }
697 704
698 return false; 705 return false;
699 } 706 }
700 707
701 // For GL_[UN]PACK_ALIGNMENT. 708 // For GL_[UN]PACK_ALIGNMENT.
(...skipping 20 matching lines...) Expand all
722 static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc, 729 static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc,
723 const GrGLInterface* interface) { 730 const GrGLInterface* interface) {
724 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) { 731 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) {
725 return GR_GL_GET_ERROR(interface); 732 return GR_GL_GET_ERROR(interface);
726 } else { 733 } else {
727 return CHECK_ALLOC_ERROR(interface); 734 return CHECK_ALLOC_ERROR(interface);
728 } 735 }
729 } 736 }
730 737
731 bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, 738 bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc,
732 GrGLenum target, 739 GrGLTextureInfo* info,
733 UploadType uploadType, 740 UploadType uploadType,
734 int left, int top, int width, int height, 741 int left, int top, int width, int height,
735 GrPixelConfig dataConfig, 742 GrPixelConfig dataConfig,
736 const void* dataOrOffset, 743 const void* dataOrOffset,
737 size_t rowBytes) { 744 size_t rowBytes) {
738 SkASSERT(dataOrOffset || kNewTexture_UploadType == uploadType || 745 SkASSERT(dataOrOffset || kNewTexture_UploadType == uploadType ||
739 kTransfer_UploadType == uploadType); 746 kTransfer_UploadType == uploadType);
740 747
741 // If we're uploading compressed data then we should be using uploadCompress edTexData 748 // If we're uploading compressed data then we should be using uploadCompress edTexData
742 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); 749 SkASSERT(!GrPixelConfigIsCompressed(dataConfig));
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE)); 826 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE));
820 } 827 }
821 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig) )); 828 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig) ));
822 } 829 }
823 bool succeeded = true; 830 bool succeeded = true;
824 if (kNewTexture_UploadType == uploadType) { 831 if (kNewTexture_UploadType == uploadType) {
825 if (dataOrOffset && 832 if (dataOrOffset &&
826 !(0 == left && 0 == top && desc.fWidth == width && desc.fHeight == h eight)) { 833 !(0 == left && 0 == top && desc.fWidth == width && desc.fHeight == h eight)) {
827 succeeded = false; 834 succeeded = false;
828 } else { 835 } else {
829 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); 836 if (desc.fTextureStorageAllocator) {
830 GL_ALLOC_CALL(this->glInterface(), TexImage2D(target, 0, internalFor mat, desc.fWidth, 837 succeeded = desc.fTextureStorageAllocator->allocateTextureStorag e(
831 desc.fHeight, 0, exter nalFormat, 838 info->fID, width, height);
832 externalType, dataOrOf fset)); 839 if (succeeded && dataOrOffset) {
833 GrGLenum error = check_alloc_error(desc, this->glInterface()); 840 GL_CALL(TexSubImage2D(info->fTarget,
834 if (error != GR_GL_NO_ERROR) { 841 0, // level
835 succeeded = false; 842 left, top,
836 } 843 width, height,
844 externalFormat, externalType, dataOrOf fset));
845 }
846 } else {
847 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
848 GL_ALLOC_CALL(this->glInterface(), TexImage2D(
849 info->fTarget, 0, internalFormat, desc.fWidth, desc.fHeight, 0, externalFormat,
850 externalType, dataOrOffset));
851 GrGLenum error = check_alloc_error(desc, this->glInterface());
852 if (error != GR_GL_NO_ERROR) {
853 succeeded = false;
854 }
855 }
837 } 856 }
838 } else { 857 } else {
839 if (swFlipY || glFlipY) { 858 if (swFlipY || glFlipY) {
840 top = desc.fHeight - (top + height); 859 top = desc.fHeight - (top + height);
841 } 860 }
842 GL_CALL(TexSubImage2D(target, 861 GL_CALL(TexSubImage2D(info->fTarget,
843 0, // level 862 0, // level
844 left, top, 863 left, top,
845 width, height, 864 width, height,
846 externalFormat, externalType, dataOrOffset)); 865 externalFormat, externalType, dataOrOffset));
847 } 866 }
848 867
849 if (restoreGLRowLength) { 868 if (restoreGLRowLength) {
850 SkASSERT(this->glCaps().unpackRowLengthSupport()); 869 SkASSERT(this->glCaps().unpackRowLengthSupport());
851 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); 870 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
852 } 871 }
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 //SkDebugf("MSAA RT requested but not supported on this platform."); 1117 //SkDebugf("MSAA RT requested but not supported on this platform.");
1099 return return_null_texture(); 1118 return return_null_texture();
1100 } 1119 }
1101 1120
1102 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); 1121 bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag);
1103 1122
1104 GrGLTexture::IDDesc idDesc; 1123 GrGLTexture::IDDesc idDesc;
1105 idDesc.fInfo.fID = 0; 1124 idDesc.fInfo.fID = 0;
1106 GL_CALL(GenTextures(1, &idDesc.fInfo.fID)); 1125 GL_CALL(GenTextures(1, &idDesc.fInfo.fID));
1107 idDesc.fLifeCycle = lifeCycle; 1126 idDesc.fLifeCycle = lifeCycle;
1108 // We only support GL_TEXTURE_2D at the moment. 1127
1109 idDesc.fInfo.fTarget = GR_GL_TEXTURE_2D; 1128 if (desc.fTextureStorageAllocator) {
1129 idDesc.fInfo.fTarget = desc.fTextureStorageAllocator->textureStorageTarg et();
1130 } else {
1131 idDesc.fInfo.fTarget = GR_GL_TEXTURE_2D;
1132 }
1110 1133
1111 if (!idDesc.fInfo.fID) { 1134 if (!idDesc.fInfo.fID) {
1112 return return_null_texture(); 1135 return return_null_texture();
1113 } 1136 }
1114 1137
1115 this->setScratchTextureUnit(); 1138 this->setScratchTextureUnit();
1116 GL_CALL(BindTexture(idDesc.fInfo.fTarget, idDesc.fInfo.fID)); 1139 GL_CALL(BindTexture(idDesc.fInfo.fTarget, idDesc.fInfo.fID));
1117 1140
1118 if (renderTarget && this->glCaps().textureUsageSupport()) { 1141 if (renderTarget && this->glCaps().textureUsageSupport()) {
1119 // provides a hint about how this texture will be used 1142 // provides a hint about how this texture will be used
(...skipping 17 matching lines...) Expand all
1137 initialTexParams.fMagFilter)); 1160 initialTexParams.fMagFilter));
1138 GL_CALL(TexParameteri(idDesc.fInfo.fTarget, 1161 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1139 GR_GL_TEXTURE_MIN_FILTER, 1162 GR_GL_TEXTURE_MIN_FILTER,
1140 initialTexParams.fMinFilter)); 1163 initialTexParams.fMinFilter));
1141 GL_CALL(TexParameteri(idDesc.fInfo.fTarget, 1164 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1142 GR_GL_TEXTURE_WRAP_S, 1165 GR_GL_TEXTURE_WRAP_S,
1143 initialTexParams.fWrapS)); 1166 initialTexParams.fWrapS));
1144 GL_CALL(TexParameteri(idDesc.fInfo.fTarget, 1167 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1145 GR_GL_TEXTURE_WRAP_T, 1168 GR_GL_TEXTURE_WRAP_T,
1146 initialTexParams.fWrapT)); 1169 initialTexParams.fWrapT));
1147 if (!this->uploadTexData(desc, idDesc.fInfo.fTarget, kNewTexture_UploadType, 0, 0, 1170 if (!this->uploadTexData(desc, &idDesc.fInfo, kNewTexture_UploadType, 0, 0,
1148 desc.fWidth, desc.fHeight, 1171 desc.fWidth, desc.fHeight,
1149 desc.fConfig, srcData, rowBytes)) { 1172 desc.fConfig, srcData, rowBytes)) {
1150 GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID)); 1173 GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID));
1151 return return_null_texture(); 1174 return return_null_texture();
1152 } 1175 }
1153 1176
1154 GrGLTexture* tex; 1177 GrGLTexture* tex;
1155 if (renderTarget) { 1178 if (renderTarget) {
1156 // unbind the texture from the texture unit before binding it to the fra me buffer 1179 // unbind the texture from the texture unit before binding it to the fra me buffer
1157 GL_CALL(BindTexture(idDesc.fInfo.fTarget, 0)); 1180 GL_CALL(BindTexture(idDesc.fInfo.fTarget, 0));
(...skipping 2398 matching lines...) Expand 10 before | Expand all | Expand 10 after
3556 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() || 3579 if (GR_GL_TEXTURE_EXTERNAL == glTexture->target() ||
3557 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) { 3580 GR_GL_TEXTURE_RECTANGLE == glTexture->target()) {
3558 copyParams->fFilter = GrTextureParams::kNone_FilterMode; 3581 copyParams->fFilter = GrTextureParams::kNone_FilterMode;
3559 copyParams->fWidth = texture->width(); 3582 copyParams->fWidth = texture->width();
3560 copyParams->fHeight = texture->height(); 3583 copyParams->fHeight = texture->height();
3561 return true; 3584 return true;
3562 } 3585 }
3563 } 3586 }
3564 return false; 3587 return false;
3565 } 3588 }
OLDNEW
« include/gpu/GrTypes.h ('K') | « 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