Index: src/gpu/gl/GrGLGpu.cpp |
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp |
index feeb23db871906f91d19743921a0f920a7460206..bf0b297c8cf064620b4ac55586c9672ff969f75c 100644 |
--- a/src/gpu/gl/GrGLGpu.cpp |
+++ b/src/gpu/gl/GrGLGpu.cpp |
@@ -649,11 +649,8 @@ |
success = this->uploadCompressedTexData(glTex->desc(), glTex->target(), buffer, |
kWrite_UploadType, left, top, width, height); |
} else { |
- success = this->uploadTexData( |
- glTex->desc(), |
- reinterpret_cast<GrGLTextureInfo*>(glTex->getTextureHandle()), |
- kWrite_UploadType, left, top, width, height, config, buffer, |
- rowBytes); |
+ success = this->uploadTexData(glTex->desc(), glTex->target(), kWrite_UploadType, |
+ left, top, width, height, config, buffer, rowBytes); |
} |
if (success) { |
@@ -690,11 +687,8 @@ |
GL_CALL(BindBuffer(glBuffer->bufferType(), glBuffer->bufferID())); |
bool success = false; |
- success = this->uploadTexData( |
- glTex->desc(), |
- reinterpret_cast<GrGLTextureInfo*>(glTex->getTextureHandle()), |
- kTransfer_UploadType, left, top, width, height, config, buffer, |
- rowBytes); |
+ success = this->uploadTexData(glTex->desc(), glTex->target(), kTransfer_UploadType, |
+ left, top, width, height, config, buffer, rowBytes); |
if (success) { |
glTex->texturePriv().dirtyMipMaps(true); |
@@ -735,7 +729,7 @@ |
} |
bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, |
- GrGLTextureInfo* info, |
+ GrGLenum target, |
UploadType uploadType, |
int left, int top, int width, int height, |
GrPixelConfig dataConfig, |
@@ -832,30 +826,20 @@ |
!(0 == left && 0 == top && desc.fWidth == width && desc.fHeight == height)) { |
succeeded = false; |
} else { |
- if (desc.fTextureStorageAllocator.fAllocateTextureStorage) { |
- if (dataOrOffset) { |
- GL_CALL(TexSubImage2D(info->fTarget, |
- 0, // level |
- left, top, |
- width, height, |
- externalFormat, externalType, dataOrOffset)); |
- } |
- } else { |
- CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
- GL_ALLOC_CALL(this->glInterface(), TexImage2D( |
- info->fTarget, 0, internalFormat, desc.fWidth, desc.fHeight, 0, externalFormat, |
- externalType, dataOrOffset)); |
- GrGLenum error = check_alloc_error(desc, this->glInterface()); |
- if (error != GR_GL_NO_ERROR) { |
- succeeded = false; |
- } |
- } |
+ CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); |
+ GL_ALLOC_CALL(this->glInterface(), TexImage2D(target, 0, internalFormat, desc.fWidth, |
+ desc.fHeight, 0, externalFormat, |
+ externalType, dataOrOffset)); |
+ GrGLenum error = check_alloc_error(desc, this->glInterface()); |
+ if (error != GR_GL_NO_ERROR) { |
+ succeeded = false; |
+ } |
} |
} else { |
if (swFlipY || glFlipY) { |
top = desc.fHeight - (top + height); |
} |
- GL_CALL(TexSubImage2D(info->fTarget, |
+ GL_CALL(TexSubImage2D(target, |
0, // level |
left, top, |
width, height, |
@@ -1118,10 +1102,52 @@ |
bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); |
GrGLTexture::IDDesc idDesc; |
+ idDesc.fInfo.fID = 0; |
+ GL_CALL(GenTextures(1, &idDesc.fInfo.fID)); |
idDesc.fLifeCycle = lifeCycle; |
+ // We only support GL_TEXTURE_2D at the moment. |
+ idDesc.fInfo.fTarget = GR_GL_TEXTURE_2D; |
+ |
+ if (!idDesc.fInfo.fID) { |
+ return return_null_texture(); |
+ } |
+ |
+ this->setScratchTextureUnit(); |
+ GL_CALL(BindTexture(idDesc.fInfo.fTarget, idDesc.fInfo.fID)); |
+ |
+ if (renderTarget && this->glCaps().textureUsageSupport()) { |
+ // provides a hint about how this texture will be used |
+ GL_CALL(TexParameteri(idDesc.fInfo.fTarget, |
+ GR_GL_TEXTURE_USAGE, |
+ GR_GL_FRAMEBUFFER_ATTACHMENT)); |
+ } |
+ |
+ // Some drivers like to know filter/wrap before seeing glTexImage2D. Some |
+ // drivers have a bug where an FBO won't be complete if it includes a |
+ // texture that is not mipmap complete (considering the filter in use). |
GrGLTexture::TexParams initialTexParams; |
- if (!this->createTextureImpl(desc, &idDesc.fInfo, renderTarget, srcData, |
- &initialTexParams, rowBytes)) { |
+ // we only set a subset here so invalidate first |
+ initialTexParams.invalidate(); |
+ initialTexParams.fMinFilter = GR_GL_NEAREST; |
+ initialTexParams.fMagFilter = GR_GL_NEAREST; |
+ initialTexParams.fWrapS = GR_GL_CLAMP_TO_EDGE; |
+ initialTexParams.fWrapT = GR_GL_CLAMP_TO_EDGE; |
+ GL_CALL(TexParameteri(idDesc.fInfo.fTarget, |
+ GR_GL_TEXTURE_MAG_FILTER, |
+ initialTexParams.fMagFilter)); |
+ GL_CALL(TexParameteri(idDesc.fInfo.fTarget, |
+ GR_GL_TEXTURE_MIN_FILTER, |
+ initialTexParams.fMinFilter)); |
+ GL_CALL(TexParameteri(idDesc.fInfo.fTarget, |
+ GR_GL_TEXTURE_WRAP_S, |
+ initialTexParams.fWrapS)); |
+ GL_CALL(TexParameteri(idDesc.fInfo.fTarget, |
+ GR_GL_TEXTURE_WRAP_T, |
+ initialTexParams.fWrapT)); |
+ if (!this->uploadTexData(desc, idDesc.fInfo.fTarget, kNewTexture_UploadType, 0, 0, |
+ desc.fWidth, desc.fHeight, |
+ desc.fConfig, srcData, rowBytes)) { |
+ GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID)); |
return return_null_texture(); |
} |
@@ -1344,86 +1370,6 @@ |
return this->glCaps().getStencilFormatIndexForConfig(config); |
} |
-bool GrGLGpu::createTextureImpl(const GrSurfaceDesc& desc, GrGLTextureInfo* info, |
- bool renderTarget, const void* srcData, |
- GrGLTexture::TexParams* initialTexParams, size_t rowBytes) { |
- // Some drivers like to know filter/wrap before seeing glTexImage2D. Some |
- // drivers have a bug where an FBO won't be complete if it includes a |
- // texture that is not mipmap complete (considering the filter in use). |
- |
- // we only set a subset here so invalidate first |
- initialTexParams->invalidate(); |
- initialTexParams->fMinFilter = GR_GL_NEAREST; |
- initialTexParams->fMagFilter = GR_GL_NEAREST; |
- initialTexParams->fWrapS = GR_GL_CLAMP_TO_EDGE; |
- initialTexParams->fWrapT = GR_GL_CLAMP_TO_EDGE; |
- |
- if (desc.fTextureStorageAllocator.fAllocateTextureStorage) { |
- return this->createTextureExternalAllocatorImpl(desc, info, srcData, rowBytes); |
- } |
- |
- info->fID = 0; |
- info->fTarget = GR_GL_TEXTURE_2D; |
- GL_CALL(GenTextures(1, &(info->fID))); |
- |
- if (!info->fID) { |
- return false; |
- } |
- |
- this->setScratchTextureUnit(); |
- GL_CALL(BindTexture(info->fTarget, info->fID)); |
- |
- if (renderTarget && this->glCaps().textureUsageSupport()) { |
- // provides a hint about how this texture will be used |
- GL_CALL(TexParameteri(info->fTarget, |
- GR_GL_TEXTURE_USAGE, |
- GR_GL_FRAMEBUFFER_ATTACHMENT)); |
- } |
- |
- GL_CALL(TexParameteri(info->fTarget, |
- GR_GL_TEXTURE_MAG_FILTER, |
- initialTexParams->fMagFilter)); |
- GL_CALL(TexParameteri(info->fTarget, |
- GR_GL_TEXTURE_MIN_FILTER, |
- initialTexParams->fMinFilter)); |
- GL_CALL(TexParameteri(info->fTarget, |
- GR_GL_TEXTURE_WRAP_S, |
- initialTexParams->fWrapS)); |
- GL_CALL(TexParameteri(info->fTarget, |
- GR_GL_TEXTURE_WRAP_T, |
- initialTexParams->fWrapT)); |
- if (!this->uploadTexData(desc, info, kNewTexture_UploadType, 0, 0, |
- desc.fWidth, desc.fHeight, |
- desc.fConfig, srcData, rowBytes)) { |
- GL_CALL(DeleteTextures(1, &(info->fID))); |
- return false; |
- } |
- return true; |
-} |
- |
-bool GrGLGpu::createTextureExternalAllocatorImpl( |
- const GrSurfaceDesc& desc, GrGLTextureInfo* info, const void* srcData, size_t rowBytes) { |
- switch (desc.fTextureStorageAllocator.fAllocateTextureStorage( |
- desc.fTextureStorageAllocator.fCtx, reinterpret_cast<GrBackendObject>(info), |
- desc.fWidth, desc.fHeight, desc.fConfig, srcData, desc.fOrigin)) { |
- case GrTextureStorageAllocator::Result::kSucceededAndUploaded: |
- return true; |
- case GrTextureStorageAllocator::Result::kFailed: |
- return false; |
- case GrTextureStorageAllocator::Result::kSucceededWithoutUpload: |
- break; |
- } |
- |
- if (!this->uploadTexData(desc, info, kNewTexture_UploadType, 0, 0, |
- desc.fWidth, desc.fHeight, |
- desc.fConfig, srcData, rowBytes)) { |
- desc.fTextureStorageAllocator.fDeallocateTextureStorage( |
- desc.fTextureStorageAllocator.fCtx, reinterpret_cast<GrBackendObject>(info)); |
- return false; |
- } |
- return true; |
-} |
- |
GrStencilAttachment* GrGLGpu::createStencilAttachmentForRenderTarget(const GrRenderTarget* rt, |
int width, |
int height) { |