| Index: src/gpu/gl/GrGpuGL.cpp
|
| diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
|
| index 88e7be0ed190233c8efe30338afa9640d2a73798..a2a2350d1a3e840b8edc3fd98e74aa1c5ae74278 100644
|
| --- a/src/gpu/gl/GrGpuGL.cpp
|
| +++ b/src/gpu/gl/GrGpuGL.cpp
|
| @@ -374,45 +374,38 @@ GrTexture* GrGpuGL::onWrapBackendTexture(const GrBackendTextureDesc& desc) {
|
| return NULL;
|
| }
|
|
|
| - GrGLTexture::Desc glTexDesc;
|
| + GrGLTexture::IDDesc idDesc;
|
| + GrSurfaceDesc surfDesc;
|
| +
|
| + idDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle);
|
| + idDesc.fIsWrapped = true;
|
| +
|
| // next line relies on GrBackendTextureDesc's flags matching GrTexture's
|
| - glTexDesc.fFlags = (GrSurfaceFlags) desc.fFlags;
|
| - glTexDesc.fWidth = desc.fWidth;
|
| - glTexDesc.fHeight = desc.fHeight;
|
| - glTexDesc.fConfig = desc.fConfig;
|
| - glTexDesc.fSampleCnt = desc.fSampleCnt;
|
| - glTexDesc.fTextureID = static_cast<GrGLuint>(desc.fTextureHandle);
|
| - glTexDesc.fIsWrapped = true;
|
| + surfDesc.fFlags = (GrSurfaceFlags) desc.fFlags;
|
| + surfDesc.fWidth = desc.fWidth;
|
| + surfDesc.fHeight = desc.fHeight;
|
| + surfDesc.fConfig = desc.fConfig;
|
| + surfDesc.fSampleCnt = desc.fSampleCnt;
|
| bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrBackendTextureFlag);
|
| // FIXME: this should be calling resolve_origin(), but Chrome code is currently
|
| // assuming the old behaviour, which is that backend textures are always
|
| // BottomLeft, even for non-RT's. Once Chrome is fixed, change this to:
|
| // glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget);
|
| if (kDefault_GrSurfaceOrigin == desc.fOrigin) {
|
| - glTexDesc.fOrigin = kBottomLeft_GrSurfaceOrigin;
|
| + surfDesc.fOrigin = kBottomLeft_GrSurfaceOrigin;
|
| } else {
|
| - glTexDesc.fOrigin = desc.fOrigin;
|
| + surfDesc.fOrigin = desc.fOrigin;
|
| }
|
|
|
| GrGLTexture* texture = NULL;
|
| if (renderTarget) {
|
| - GrGLRenderTarget::Desc glRTDesc;
|
| - glRTDesc.fRTFBOID = 0;
|
| - glRTDesc.fTexFBOID = 0;
|
| - glRTDesc.fMSColorRenderbufferID = 0;
|
| - glRTDesc.fConfig = desc.fConfig;
|
| - glRTDesc.fSampleCnt = desc.fSampleCnt;
|
| - glRTDesc.fOrigin = glTexDesc.fOrigin;
|
| - glRTDesc.fCheckAllocation = false;
|
| - if (!this->createRenderTargetObjects(glTexDesc.fWidth,
|
| - glTexDesc.fHeight,
|
| - glTexDesc.fTextureID,
|
| - &glRTDesc)) {
|
| + GrGLRenderTarget::IDDesc rtIDDesc;
|
| + if (!this->createRenderTargetObjects(surfDesc, idDesc.fTextureID, &rtIDDesc)) {
|
| return NULL;
|
| }
|
| - texture = SkNEW_ARGS(GrGLTexture, (this, glTexDesc, glRTDesc));
|
| + texture = SkNEW_ARGS(GrGLTexture, (this, surfDesc, idDesc, rtIDDesc));
|
| } else {
|
| - texture = SkNEW_ARGS(GrGLTexture, (this, glTexDesc));
|
| + texture = SkNEW_ARGS(GrGLTexture, (this, surfDesc, idDesc));
|
| }
|
| if (NULL == texture) {
|
| return NULL;
|
| @@ -421,31 +414,33 @@ GrTexture* GrGpuGL::onWrapBackendTexture(const GrBackendTextureDesc& desc) {
|
| return texture;
|
| }
|
|
|
| -GrRenderTarget* GrGpuGL::onWrapBackendRenderTarget(const GrBackendRenderTargetDesc& desc) {
|
| - GrGLRenderTarget::Desc glDesc;
|
| - glDesc.fConfig = desc.fConfig;
|
| - glDesc.fRTFBOID = static_cast<GrGLuint>(desc.fRenderTargetHandle);
|
| - glDesc.fMSColorRenderbufferID = 0;
|
| - glDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID;
|
| - glDesc.fSampleCnt = desc.fSampleCnt;
|
| - glDesc.fIsWrapped = true;
|
| - glDesc.fCheckAllocation = false;
|
| -
|
| - glDesc.fOrigin = resolve_origin(desc.fOrigin, true);
|
| +GrRenderTarget* GrGpuGL::onWrapBackendRenderTarget(const GrBackendRenderTargetDesc& wrapDesc) {
|
| + GrGLRenderTarget::IDDesc idDesc;
|
| + idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle);
|
| + idDesc.fMSColorRenderbufferID = 0;
|
| + idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID;
|
| +
|
| + GrSurfaceDesc desc;
|
| + desc.fConfig = wrapDesc.fConfig;
|
| + desc.fFlags = kCheckAllocation_GrSurfaceFlag;
|
| + desc.fWidth = wrapDesc.fWidth;
|
| + desc.fHeight = wrapDesc.fHeight;
|
| + desc.fSampleCnt = wrapDesc.fSampleCnt;
|
| + desc.fOrigin = resolve_origin(wrapDesc.fOrigin, true);
|
| +
|
| GrGLIRect viewport;
|
| viewport.fLeft = 0;
|
| viewport.fBottom = 0;
|
| viewport.fWidth = desc.fWidth;
|
| viewport.fHeight = desc.fHeight;
|
|
|
| - GrRenderTarget* tgt = SkNEW_ARGS(GrGLRenderTarget,
|
| - (this, glDesc, viewport));
|
| - if (desc.fStencilBits) {
|
| + GrRenderTarget* tgt = SkNEW_ARGS(GrGLRenderTarget, (this, desc, idDesc, viewport));
|
| + if (wrapDesc.fStencilBits) {
|
| GrGLStencilBuffer::Format format;
|
| format.fInternalFormat = GrGLStencilBuffer::kUnknownInternalFormat;
|
| format.fPacked = false;
|
| - format.fStencilBits = desc.fStencilBits;
|
| - format.fTotalBits = desc.fStencilBits;
|
| + format.fStencilBits = wrapDesc.fStencilBits;
|
| + format.fTotalBits = wrapDesc.fStencilBits;
|
| static const bool kIsSBWrapped = false;
|
| GrGLStencilBuffer* sb = SkNEW_ARGS(GrGLStencilBuffer,
|
| (this,
|
| @@ -474,25 +469,16 @@ bool GrGpuGL::onWriteTexturePixels(GrTexture* texture,
|
|
|
| this->setScratchTextureUnit();
|
| GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTex->textureID()));
|
| - GrGLTexture::Desc desc;
|
| - desc.fFlags = glTex->desc().fFlags;
|
| - desc.fWidth = glTex->width();
|
| - desc.fHeight = glTex->height();
|
| - desc.fConfig = glTex->config();
|
| - desc.fSampleCnt = glTex->desc().fSampleCnt;
|
| - desc.fTextureID = glTex->textureID();
|
| - desc.fOrigin = glTex->origin();
|
|
|
| bool success = false;
|
| - if (GrPixelConfigIsCompressed(desc.fConfig)) {
|
| + if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) {
|
| // We check that config == desc.fConfig in GrGpuGL::canWriteTexturePixels()
|
| - SkASSERT(config == desc.fConfig);
|
| - success = this->uploadCompressedTexData(desc, buffer, false,
|
| - left, top, width, height);
|
| + SkASSERT(config == glTex->desc().fConfig);
|
| + success = this->uploadCompressedTexData(glTex->desc(), buffer, false, left, top, width,
|
| + height);
|
| } else {
|
| - success = this->uploadTexData(desc, false,
|
| - left, top, width, height,
|
| - config, buffer, rowBytes);
|
| + success = this->uploadTexData(glTex->desc(), false, left, top, width, height, config,
|
| + buffer, rowBytes);
|
| }
|
|
|
| if (success) {
|
| @@ -503,13 +489,12 @@ bool GrGpuGL::onWriteTexturePixels(GrTexture* texture,
|
| return false;
|
| }
|
|
|
| -namespace {
|
| -bool adjust_pixel_ops_params(int surfaceWidth,
|
| - int surfaceHeight,
|
| - size_t bpp,
|
| - int* left, int* top, int* width, int* height,
|
| - const void** data,
|
| - size_t* rowBytes) {
|
| +static bool adjust_pixel_ops_params(int surfaceWidth,
|
| + int surfaceHeight,
|
| + size_t bpp,
|
| + int* left, int* top, int* width, int* height,
|
| + const void** data,
|
| + size_t* rowBytes) {
|
| if (!*rowBytes) {
|
| *rowBytes = *width * bpp;
|
| }
|
| @@ -530,7 +515,8 @@ bool adjust_pixel_ops_params(int surfaceWidth,
|
| return true;
|
| }
|
|
|
| -GrGLenum check_alloc_error(const GrSurfaceDesc& desc, const GrGLInterface* interface) {
|
| +static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc,
|
| + const GrGLInterface* interface) {
|
| if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) {
|
| return GR_GL_GET_ERROR(interface);
|
| } else {
|
| @@ -538,9 +524,7 @@ GrGLenum check_alloc_error(const GrSurfaceDesc& desc, const GrGLInterface* inter
|
| }
|
| }
|
|
|
| -}
|
| -
|
| -bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc,
|
| +bool GrGpuGL::uploadTexData(const GrSurfaceDesc& desc,
|
| bool isNewTexture,
|
| int left, int top, int width, int height,
|
| GrPixelConfig dataConfig,
|
| @@ -715,7 +699,7 @@ bool GrGpuGL::uploadTexData(const GrGLTexture::Desc& desc,
|
| // create a CompressedTexData struct that takes a desc/ptr and figures out
|
| // the proper upload semantics. Then users can construct this function how they
|
| // see fit if they want to go against the "standard" way to do it.
|
| -bool GrGpuGL::uploadCompressedTexData(const GrGLTexture::Desc& desc,
|
| +bool GrGpuGL::uploadCompressedTexData(const GrSurfaceDesc& desc,
|
| const void* data,
|
| bool isNewTexture,
|
| int left, int top, int width, int height) {
|
| @@ -821,24 +805,23 @@ static bool renderbuffer_storage_msaa(GrGLContext& ctx,
|
| return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface()));;
|
| }
|
|
|
| -bool GrGpuGL::createRenderTargetObjects(int width, int height,
|
| - GrGLuint texID,
|
| - GrGLRenderTarget::Desc* desc) {
|
| - desc->fMSColorRenderbufferID = 0;
|
| - desc->fRTFBOID = 0;
|
| - desc->fTexFBOID = 0;
|
| - desc->fIsWrapped = false;
|
| +bool GrGpuGL::createRenderTargetObjects(const GrSurfaceDesc& desc, GrGLuint texID,
|
| + GrGLRenderTarget::IDDesc* idDesc) {
|
| + idDesc->fMSColorRenderbufferID = 0;
|
| + idDesc->fRTFBOID = 0;
|
| + idDesc->fTexFBOID = 0;
|
| + idDesc->fIsWrapped = false;
|
|
|
| GrGLenum status;
|
|
|
| GrGLenum msColorFormat = 0; // suppress warning
|
|
|
| - if (desc->fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType()) {
|
| + if (desc.fSampleCnt > 0 && GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType()) {
|
| goto FAILED;
|
| }
|
|
|
| - GL_CALL(GenFramebuffers(1, &desc->fTexFBOID));
|
| - if (!desc->fTexFBOID) {
|
| + GL_CALL(GenFramebuffers(1, &idDesc->fTexFBOID));
|
| + if (!idDesc->fTexFBOID) {
|
| goto FAILED;
|
| }
|
|
|
| @@ -847,12 +830,12 @@ bool GrGpuGL::createRenderTargetObjects(int width, int height,
|
| // the texture bound to the other. The exception is the IMG multisample extension. With this
|
| // extension the texture is multisampled when rendered to and then auto-resolves it when it is
|
| // rendered from.
|
| - if (desc->fSampleCnt > 0 && this->glCaps().usesMSAARenderBuffers()) {
|
| - GL_CALL(GenFramebuffers(1, &desc->fRTFBOID));
|
| - GL_CALL(GenRenderbuffers(1, &desc->fMSColorRenderbufferID));
|
| - if (!desc->fRTFBOID ||
|
| - !desc->fMSColorRenderbufferID ||
|
| - !this->configToGLFormats(desc->fConfig,
|
| + if (desc.fSampleCnt > 0 && this->glCaps().usesMSAARenderBuffers()) {
|
| + GL_CALL(GenFramebuffers(1, &idDesc->fRTFBOID));
|
| + GL_CALL(GenRenderbuffers(1, &idDesc->fMSColorRenderbufferID));
|
| + if (!idDesc->fRTFBOID ||
|
| + !idDesc->fMSColorRenderbufferID ||
|
| + !this->configToGLFormats(desc.fConfig,
|
| // ES2 and ES3 require sized internal formats for rb storage.
|
| kGLES_GrGLStandard == this->glStandard(),
|
| &msColorFormat,
|
| @@ -861,70 +844,69 @@ bool GrGpuGL::createRenderTargetObjects(int width, int height,
|
| goto FAILED;
|
| }
|
| } else {
|
| - desc->fRTFBOID = desc->fTexFBOID;
|
| + idDesc->fRTFBOID = idDesc->fTexFBOID;
|
| }
|
|
|
| // below here we may bind the FBO
|
| fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
|
| - if (desc->fRTFBOID != desc->fTexFBOID) {
|
| - SkASSERT(desc->fSampleCnt > 0);
|
| - GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER,
|
| - desc->fMSColorRenderbufferID));
|
| + if (idDesc->fRTFBOID != idDesc->fTexFBOID) {
|
| + SkASSERT(desc.fSampleCnt > 0);
|
| + GL_CALL(BindRenderbuffer(GR_GL_RENDERBUFFER, idDesc->fMSColorRenderbufferID));
|
| if (!renderbuffer_storage_msaa(fGLContext,
|
| - desc->fSampleCnt,
|
| + desc.fSampleCnt,
|
| msColorFormat,
|
| - width, height)) {
|
| + desc.fWidth, desc.fHeight)) {
|
| goto FAILED;
|
| }
|
| fGPUStats.incRenderTargetBinds();
|
| - GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fRTFBOID));
|
| + GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fRTFBOID));
|
| GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER,
|
| GR_GL_COLOR_ATTACHMENT0,
|
| GR_GL_RENDERBUFFER,
|
| - desc->fMSColorRenderbufferID));
|
| - if (desc->fCheckAllocation ||
|
| - !this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) {
|
| + idDesc->fMSColorRenderbufferID));
|
| + if ((desc.fFlags & kCheckAllocation_GrSurfaceFlag) ||
|
| + !this->glCaps().isConfigVerifiedColorAttachment(desc.fConfig)) {
|
| GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
|
| if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
|
| goto FAILED;
|
| }
|
| - fGLContext.caps()->markConfigAsValidColorAttachment(desc->fConfig);
|
| + fGLContext.caps()->markConfigAsValidColorAttachment(desc.fConfig);
|
| }
|
| }
|
| fGPUStats.incRenderTargetBinds();
|
| - GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID));
|
| + GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, idDesc->fTexFBOID));
|
|
|
| - if (this->glCaps().usesImplicitMSAAResolve() && desc->fSampleCnt > 0) {
|
| + if (this->glCaps().usesImplicitMSAAResolve() && desc.fSampleCnt > 0) {
|
| GL_CALL(FramebufferTexture2DMultisample(GR_GL_FRAMEBUFFER,
|
| GR_GL_COLOR_ATTACHMENT0,
|
| GR_GL_TEXTURE_2D,
|
| - texID, 0, desc->fSampleCnt));
|
| + texID, 0, desc.fSampleCnt));
|
| } else {
|
| GL_CALL(FramebufferTexture2D(GR_GL_FRAMEBUFFER,
|
| GR_GL_COLOR_ATTACHMENT0,
|
| GR_GL_TEXTURE_2D,
|
| texID, 0));
|
| }
|
| - if (desc->fCheckAllocation ||
|
| - !this->glCaps().isConfigVerifiedColorAttachment(desc->fConfig)) {
|
| + if ((desc.fFlags & kCheckAllocation_GrSurfaceFlag) ||
|
| + !this->glCaps().isConfigVerifiedColorAttachment(desc.fConfig)) {
|
| GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER));
|
| if (status != GR_GL_FRAMEBUFFER_COMPLETE) {
|
| goto FAILED;
|
| }
|
| - fGLContext.caps()->markConfigAsValidColorAttachment(desc->fConfig);
|
| + fGLContext.caps()->markConfigAsValidColorAttachment(desc.fConfig);
|
| }
|
|
|
| return true;
|
|
|
| FAILED:
|
| - if (desc->fMSColorRenderbufferID) {
|
| - GL_CALL(DeleteRenderbuffers(1, &desc->fMSColorRenderbufferID));
|
| + if (idDesc->fMSColorRenderbufferID) {
|
| + GL_CALL(DeleteRenderbuffers(1, &idDesc->fMSColorRenderbufferID));
|
| }
|
| - if (desc->fRTFBOID != desc->fTexFBOID) {
|
| - GL_CALL(DeleteFramebuffers(1, &desc->fRTFBOID));
|
| + if (idDesc->fRTFBOID != idDesc->fTexFBOID) {
|
| + GL_CALL(DeleteFramebuffers(1, &idDesc->fRTFBOID));
|
| }
|
| - if (desc->fTexFBOID) {
|
| - GL_CALL(DeleteFramebuffers(1, &desc->fTexFBOID));
|
| + if (idDesc->fTexFBOID) {
|
| + GL_CALL(DeleteFramebuffers(1, &idDesc->fTexFBOID));
|
| }
|
| return false;
|
| }
|
| @@ -941,12 +923,12 @@ static size_t as_size_t(int x) {
|
| }
|
| #endif
|
|
|
| -GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& desc,
|
| +GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& origDesc,
|
| const void* srcData,
|
| size_t rowBytes) {
|
|
|
| - GrGLTexture::Desc glTexDesc;
|
| - GrGLRenderTarget::Desc glRTDesc;
|
| + GrSurfaceDesc desc = origDesc;
|
| + GrGLRenderTarget::IDDesc rtIDDesc;
|
|
|
| // Attempt to catch un- or wrongly initialized sample counts;
|
| SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64);
|
| @@ -955,54 +937,45 @@ GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& desc,
|
| //GrPrintf("MSAA RT requested but not supported on this platform.");
|
| return return_null_texture();
|
| }
|
| - // If the sample count exceeds the max then we clamp it.
|
| - glTexDesc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount());
|
| -
|
| - glTexDesc.fFlags = desc.fFlags;
|
| - glTexDesc.fWidth = desc.fWidth;
|
| - glTexDesc.fHeight = desc.fHeight;
|
| - glTexDesc.fConfig = desc.fConfig;
|
| - glTexDesc.fIsWrapped = false;
|
| -
|
| - glRTDesc.fMSColorRenderbufferID = 0;
|
| - glRTDesc.fRTFBOID = 0;
|
| - glRTDesc.fTexFBOID = 0;
|
| - glRTDesc.fIsWrapped = false;
|
| - glRTDesc.fConfig = glTexDesc.fConfig;
|
| - glRTDesc.fCheckAllocation = SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag);
|
|
|
| bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag);
|
|
|
| - glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget);
|
| - glRTDesc.fOrigin = glTexDesc.fOrigin;
|
| + // If the sample count exceeds the max then we clamp it.
|
| + desc.fSampleCnt = SkTMin(desc.fSampleCnt, this->caps()->maxSampleCount());
|
| + desc.fOrigin = resolve_origin(desc.fOrigin, renderTarget);
|
| +
|
| + rtIDDesc.fMSColorRenderbufferID = 0;
|
| + rtIDDesc.fRTFBOID = 0;
|
| + rtIDDesc.fTexFBOID = 0;
|
| + rtIDDesc.fIsWrapped = false;
|
|
|
| - glRTDesc.fSampleCnt = glTexDesc.fSampleCnt;
|
| - if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() &&
|
| - desc.fSampleCnt) {
|
| + if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleCnt) {
|
| //GrPrintf("MSAA RT requested but not supported on this platform.");
|
| return return_null_texture();
|
| }
|
|
|
| if (renderTarget) {
|
| int maxRTSize = this->caps()->maxRenderTargetSize();
|
| - if (glTexDesc.fWidth > maxRTSize || glTexDesc.fHeight > maxRTSize) {
|
| + if (desc.fWidth > maxRTSize || desc.fHeight > maxRTSize) {
|
| return return_null_texture();
|
| }
|
| } else {
|
| int maxSize = this->caps()->maxTextureSize();
|
| - if (glTexDesc.fWidth > maxSize || glTexDesc.fHeight > maxSize) {
|
| + if (desc.fWidth > maxSize || desc.fHeight > maxSize) {
|
| return return_null_texture();
|
| }
|
| }
|
|
|
| - GL_CALL(GenTextures(1, &glTexDesc.fTextureID));
|
| + GrGLTexture::IDDesc idDesc;
|
| + GL_CALL(GenTextures(1, &idDesc.fTextureID));
|
| + idDesc.fIsWrapped = false;
|
|
|
| - if (!glTexDesc.fTextureID) {
|
| + if (!idDesc.fTextureID) {
|
| return return_null_texture();
|
| }
|
|
|
| this->setScratchTextureUnit();
|
| - GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTexDesc.fTextureID));
|
| + GL_CALL(BindTexture(GR_GL_TEXTURE_2D, idDesc.fTextureID));
|
|
|
| if (renderTarget && this->glCaps().textureUsageSupport()) {
|
| // provides a hint about how this texture will be used
|
| @@ -1033,10 +1006,10 @@ GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& desc,
|
| GL_CALL(TexParameteri(GR_GL_TEXTURE_2D,
|
| GR_GL_TEXTURE_WRAP_T,
|
| initialTexParams.fWrapT));
|
| - if (!this->uploadTexData(glTexDesc, true, 0, 0,
|
| - glTexDesc.fWidth, glTexDesc.fHeight,
|
| + if (!this->uploadTexData(desc, true, 0, 0,
|
| + desc.fWidth, desc.fHeight,
|
| desc.fConfig, srcData, rowBytes)) {
|
| - GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
|
| + GL_CALL(DeleteTextures(1, &idDesc.fTextureID));
|
| return return_null_texture();
|
| }
|
|
|
| @@ -1045,16 +1018,13 @@ GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& desc,
|
| // unbind the texture from the texture unit before binding it to the frame buffer
|
| GL_CALL(BindTexture(GR_GL_TEXTURE_2D, 0));
|
|
|
| - if (!this->createRenderTargetObjects(glTexDesc.fWidth,
|
| - glTexDesc.fHeight,
|
| - glTexDesc.fTextureID,
|
| - &glRTDesc)) {
|
| - GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
|
| + if (!this->createRenderTargetObjects(desc, idDesc.fTextureID, &rtIDDesc)) {
|
| + GL_CALL(DeleteTextures(1, &idDesc.fTextureID));
|
| return return_null_texture();
|
| }
|
| - tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc, glRTDesc));
|
| + tex = SkNEW_ARGS(GrGLTexture, (this, desc, idDesc, rtIDDesc));
|
| } else {
|
| - tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc));
|
| + tex = SkNEW_ARGS(GrGLTexture, (this, desc, idDesc));
|
| }
|
| tex->setCachedTexParams(initialTexParams, this->getResetTimestamp());
|
| #ifdef TRACE_TEXTURE_CREATION
|
| @@ -1064,41 +1034,35 @@ GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& desc,
|
| return tex;
|
| }
|
|
|
| -GrTexture* GrGpuGL::onCreateCompressedTexture(const GrSurfaceDesc& desc,
|
| - const void* srcData) {
|
| +GrTexture* GrGpuGL::onCreateCompressedTexture(const GrSurfaceDesc& origDesc, const void* srcData) {
|
|
|
| - if(SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag)) {
|
| + if(SkToBool(origDesc.fFlags & kRenderTarget_GrSurfaceFlag) || origDesc.fSampleCnt > 0) {
|
| return return_null_texture();
|
| }
|
|
|
| // Make sure that we're not flipping Y.
|
| - GrSurfaceOrigin texOrigin = resolve_origin(desc.fOrigin, false);
|
| + GrSurfaceOrigin texOrigin = resolve_origin(origDesc.fOrigin, false);
|
| if (kBottomLeft_GrSurfaceOrigin == texOrigin) {
|
| return return_null_texture();
|
| }
|
| -
|
| - GrGLTexture::Desc glTexDesc;
|
| -
|
| - glTexDesc.fFlags = desc.fFlags;
|
| - glTexDesc.fWidth = desc.fWidth;
|
| - glTexDesc.fHeight = desc.fHeight;
|
| - glTexDesc.fConfig = desc.fConfig;
|
| - glTexDesc.fIsWrapped = false;
|
| - glTexDesc.fOrigin = texOrigin;
|
| + GrSurfaceDesc desc = origDesc;
|
| + desc.fOrigin = texOrigin;
|
|
|
| int maxSize = this->caps()->maxTextureSize();
|
| - if (glTexDesc.fWidth > maxSize || glTexDesc.fHeight > maxSize) {
|
| + if (desc.fWidth > maxSize || desc.fHeight > maxSize) {
|
| return return_null_texture();
|
| }
|
|
|
| - GL_CALL(GenTextures(1, &glTexDesc.fTextureID));
|
| + GrGLTexture::IDDesc idDesc;
|
| + GL_CALL(GenTextures(1, &idDesc.fTextureID));
|
| + idDesc.fIsWrapped = false;
|
|
|
| - if (!glTexDesc.fTextureID) {
|
| + if (!idDesc.fTextureID) {
|
| return return_null_texture();
|
| }
|
|
|
| this->setScratchTextureUnit();
|
| - GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTexDesc.fTextureID));
|
| + GL_CALL(BindTexture(GR_GL_TEXTURE_2D, idDesc.fTextureID));
|
|
|
| // 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
|
| @@ -1123,13 +1087,13 @@ GrTexture* GrGpuGL::onCreateCompressedTexture(const GrSurfaceDesc& desc,
|
| GR_GL_TEXTURE_WRAP_T,
|
| initialTexParams.fWrapT));
|
|
|
| - if (!this->uploadCompressedTexData(glTexDesc, srcData)) {
|
| - GL_CALL(DeleteTextures(1, &glTexDesc.fTextureID));
|
| + if (!this->uploadCompressedTexData(desc, srcData)) {
|
| + GL_CALL(DeleteTextures(1, &idDesc.fTextureID));
|
| return return_null_texture();
|
| }
|
|
|
| GrGLTexture* tex;
|
| - tex = SkNEW_ARGS(GrGLTexture, (this, glTexDesc));
|
| + tex = SkNEW_ARGS(GrGLTexture, (this, desc, idDesc));
|
| tex->setCachedTexParams(initialTexParams, this->getResetTimestamp());
|
| #ifdef TRACE_TEXTURE_CREATION
|
| GrPrintf("--- new compressed texture [%d] size=(%d %d) config=%d\n",
|
|
|