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

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

Issue 302783002: Initial work to get ETC1 data up to the GPU (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix some code clarity issues Created 6 years, 7 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
« src/gpu/SkGr.cpp ('K') | « src/gpu/gl/GrGpuGL.h ('k') | no next file » | 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 "GrGpuGL.h" 9 #include "GrGpuGL.h"
10 #include "GrGLStencilBuffer.h" 10 #include "GrGLStencilBuffer.h"
(...skipping 680 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 if (restoreGLRowLength) { 691 if (restoreGLRowLength) {
692 SkASSERT(this->glCaps().unpackRowLengthSupport()); 692 SkASSERT(this->glCaps().unpackRowLengthSupport());
693 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); 693 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
694 } 694 }
695 if (glFlipY) { 695 if (glFlipY) {
696 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); 696 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE));
697 } 697 }
698 return succeeded; 698 return succeeded;
699 } 699 }
700 700
701 bool GrGpuGL::compressedFormatToGLFormats(GrCompressedFormat fmt, GrGLenum *inte rnal) {
702 switch(fmt) {
703 case kETC1_GrCompressedFormat:
704 *internal = GR_GL_COMPRESSED_RGB8_ETC1;
705 return true;
706 default:
707 SkASSERT(!"Not a compressed format!");
708 break;
709 }
710 return false;
711 }
712
713 bool GrGpuGL::uploadCompressedTexData(const GrGLTexture::Desc& desc,
714 GrCompressedFormat fmt,
715 const void* data) {
716 SkASSERT(NULL != data);
717
718 // No support for software flip y, yet...
719 SkASSERT(kBottomLeft_GrSurfaceOrigin != desc.fOrigin);
720
721 // Make sure that the width and height that we pass to OpenGL
722 // is a multiple of the block size.
723 GrCompressedFormatDesc ctDesc = GrGetCompressedFormatDesc(fmt);
724 SkASSERT((desc.fWidth % ctDesc.fBlockSizeX) == 0);
725 SkASSERT((desc.fHeight % ctDesc.fBlockSizeY) == 0);
726
727 int dataSize =
728 (desc.fWidth / ctDesc.fBlockSizeX) *
729 (desc.fHeight / ctDesc.fBlockSizeY) *
730 ctDesc.fBytesPerBlock;
731
robertphillips 2014/05/27 22:01:50 Remove this (tempStorage) ?
krajcevski 2014/05/27 22:19:29 Done.
732 SkAutoSMalloc<128 * 128> tempStorage;
733
734 GrGLenum internalFormat;
735 if (!this->compressedFormatToGLFormats(fmt, &internalFormat)) {
736 return false;
737 }
738
739 bool succeeded = true;
740 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
741 GL_ALLOC_CALL(this->glInterface(),
742 CompressedTexImage2D(GR_GL_TEXTURE_2D,
743 0, // level
744 internalFormat,
745 desc.fWidth, desc.fHeight,
746 0, // border
747 dataSize,
748 data));
749
750 GrGLenum error = check_alloc_error(desc, this->glInterface());
751 if (error != GR_GL_NO_ERROR) {
752 succeeded = false;
753 }
754 return succeeded;
755 }
756
701 static bool renderbuffer_storage_msaa(GrGLContext& ctx, 757 static bool renderbuffer_storage_msaa(GrGLContext& ctx,
702 int sampleCount, 758 int sampleCount,
703 GrGLenum format, 759 GrGLenum format,
704 int width, int height) { 760 int width, int height) {
705 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface()); 761 CLEAR_ERROR_BEFORE_ALLOC(ctx.interface());
706 SkASSERT(GrGLCaps::kNone_MSFBOType != ctx.caps()->msFBOType()); 762 SkASSERT(GrGLCaps::kNone_MSFBOType != ctx.caps()->msFBOType());
707 switch (ctx.caps()->msFBOType()) { 763 switch (ctx.caps()->msFBOType()) {
708 case GrGLCaps::kDesktop_ARB_MSFBOType: 764 case GrGLCaps::kDesktop_ARB_MSFBOType:
709 case GrGLCaps::kDesktop_EXT_MSFBOType: 765 case GrGLCaps::kDesktop_EXT_MSFBOType:
710 case GrGLCaps::kES_3_0_MSFBOType: 766 case GrGLCaps::kES_3_0_MSFBOType:
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc)); 1026 tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc));
971 } 1027 }
972 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); 1028 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp());
973 #ifdef TRACE_TEXTURE_CREATION 1029 #ifdef TRACE_TEXTURE_CREATION
974 GrPrintf("--- new texture [%d] size=(%d %d) config=%d\n", 1030 GrPrintf("--- new texture [%d] size=(%d %d) config=%d\n",
975 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig); 1031 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig);
976 #endif 1032 #endif
977 return tex; 1033 return tex;
978 } 1034 }
979 1035
1036 GrTexture* GrGpuGL::onCreateCompressedTexture(const GrTextureDesc& desc,
1037 const void* srcData,
1038 GrCompressedFormat format) {
1039
1040 if(SkToBool(desc.fFlags & kRenderTarget_GrTextureFlagBit)) {
1041 return return_null_texture();
1042 }
1043
1044 // Make sure that we're not flipping Y.
1045 GrSurfaceOrigin texOrigin = resolve_origin(desc.fOrigin, false);
1046 if (kBottomLeft_GrSurfaceOrigin == texOrigin) {
1047 return return_null_texture();
1048 }
1049
1050 // Make sure that the width and height are multiples of the block
1051 // size for the associated format.
1052 GrCompressedFormatDesc ctDesc = GrGetCompressedFormatDesc(format);
1053 if ((desc.fWidth % ctDesc.fBlockSizeX) != 0 ||
1054 (desc.fHeight % ctDesc.fBlockSizeY) != 0) {
1055 return return_null_texture();
1056 }
1057
1058 GrGLTexture::Desc glTexDesc;
1059
1060 glTexDesc.fFlags = desc.fFlags;
1061 glTexDesc.fWidth = desc.fWidth;
1062 glTexDesc.fHeight = desc.fHeight;
1063 glTexDesc.fConfig = desc.fConfig;
1064 glTexDesc.fIsWrapped = false;
1065 glTexDesc.fOrigin = texOrigin;
1066
1067 int maxSize = this->caps()->maxTextureSize();
1068 if (glTexDesc.fWidth > maxSize || glTexDesc.fHeight > maxSize) {
1069 return return_null_texture();
1070 }
1071
1072 GL_CALL(GenTextures(1, &glTexDesc.fTextureID));
1073
1074 if (!glTexDesc.fTextureID) {
1075 return return_null_texture();
1076 }
1077
1078 this->setScratchTextureUnit();
1079 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTexDesc.fTextureID));
1080
1081 // Some drivers like to know filter/wrap before seeing glTexImage2D. Some
1082 // drivers have a bug where an FBO won't be complete if it includes a
1083 // texture that is not mipmap complete (considering the filter in use).
1084 GrGLTexture::TexParams initialTexParams;
1085 // we only set a subset here so invalidate first
1086 initialTexParams.invalidate();
1087 initialTexParams.fMinFilter = GR_GL_NEAREST;
1088 initialTexParams.fMagFilter = GR_GL_NEAREST;
1089 initialTexParams.fWrapS = GR_GL_CLAMP_TO_EDGE;
1090 initialTexParams.fWrapT = GR_GL_CLAMP_TO_EDGE;
1091 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
1092 GR_GL_TEXTURE_MAG_FILTER,
1093 initialTexParams.fMagFilter));
1094 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
1095 GR_GL_TEXTURE_MIN_FILTER,
1096 initialTexParams.fMinFilter));
1097 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
1098 GR_GL_TEXTURE_WRAP_S,
1099 initialTexParams.fWrapS));
1100 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
1101 GR_GL_TEXTURE_WRAP_T,
1102 initialTexParams.fWrapT));
1103
1104 if (!this->uploadCompressedTexData(glTexDesc, format, srcData)) {
1105 GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
1106 return return_null_texture();
1107 }
1108
1109 GrGLTexture* tex;
1110 tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc));
1111 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp());
1112 #ifdef TRACE_TEXTURE_CREATION
1113 GrPrintf("--- new compressed texture [%d] format=%d size=(%d %d) config=%d\n ",
1114 glTexDesc.fTextureID, format, desc.fWidth, desc.fHeight, desc.fConf ig);
1115 #endif
1116 return tex;
1117 }
1118
980 namespace { 1119 namespace {
981 1120
982 const GrGLuint kUnknownBitCount = GrGLStencilBuffer::kUnknownBitCount; 1121 const GrGLuint kUnknownBitCount = GrGLStencilBuffer::kUnknownBitCount;
983 1122
984 void inline get_stencil_rb_sizes(const GrGLInterface* gl, 1123 void inline get_stencil_rb_sizes(const GrGLInterface* gl,
985 GrGLStencilBuffer::Format* format) { 1124 GrGLStencilBuffer::Format* format) {
986 1125
987 // we shouldn't ever know one size and not the other 1126 // we shouldn't ever know one size and not the other
988 SkASSERT((kUnknownBitCount == format->fStencilBits) == 1127 SkASSERT((kUnknownBitCount == format->fStencilBits) ==
989 (kUnknownBitCount == format->fTotalBits)); 1128 (kUnknownBitCount == format->fTotalBits));
(...skipping 1813 matching lines...) Expand 10 before | Expand all | Expand 10 after
2803 this->setVertexArrayID(gpu, 0); 2942 this->setVertexArrayID(gpu, 0);
2804 } 2943 }
2805 int attrCount = gpu->glCaps().maxVertexAttributes(); 2944 int attrCount = gpu->glCaps().maxVertexAttributes();
2806 if (fDefaultVertexArrayAttribState.count() != attrCount) { 2945 if (fDefaultVertexArrayAttribState.count() != attrCount) {
2807 fDefaultVertexArrayAttribState.resize(attrCount); 2946 fDefaultVertexArrayAttribState.resize(attrCount);
2808 } 2947 }
2809 attribState = &fDefaultVertexArrayAttribState; 2948 attribState = &fDefaultVertexArrayAttribState;
2810 } 2949 }
2811 return attribState; 2950 return attribState;
2812 } 2951 }
OLDNEW
« src/gpu/SkGr.cpp ('K') | « src/gpu/gl/GrGpuGL.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698