From 7d2b16ad13fd3262c776ae75ae35da4ad69df690 Mon Sep 17 00:00:00 2001 From: Greg Daniel Date: Tue, 13 Mar 2018 16:44:48 -0400 Subject: Improve handling of GrPixelConfig in GrBackendTex/RT ctors Make sure that no client facing code was relying on what we set as the default value for fConfig by making in kUnkown. Bug: skia: Change-Id: Ie52ff08ba8deeacc16fe06eb0dd0c7292b2edf91 Reviewed-on: https://skia-review.googlesource.com/114261 Reviewed-by: Robert Phillips Reviewed-by: Brian Salomon Commit-Queue: Greg Daniel --- include/gpu/GrBackendSurface.h | 11 +++++++++-- src/gpu/GrBackendSurface.cpp | 8 ++++---- src/gpu/gl/GrGLGpu.cpp | 8 ++++++-- src/gpu/gl/GrGLRenderTarget.cpp | 12 ++++++++++-- src/gpu/gl/GrGLTexture.cpp | 10 +++++++++- src/gpu/gl/GrGLUtil.cpp | 35 ----------------------------------- src/gpu/gl/GrGLUtil.h | 2 -- src/gpu/vk/GrVkGpu.cpp | 10 +++++++--- src/gpu/vk/GrVkRenderTarget.cpp | 12 ++++++++++-- src/gpu/vk/GrVkTexture.cpp | 9 ++++++++- src/gpu/vk/GrVkUtil.cpp | 34 ---------------------------------- src/gpu/vk/GrVkUtil.h | 5 ----- src/image/SkImage_Gpu.cpp | 7 ++++--- tests/ProxyTest.cpp | 10 +++++----- tests/SurfaceTest.cpp | 2 ++ tests/VkWrapTests.cpp | 21 +++++++++++++-------- tools/gpu/GrTest.cpp | 22 +++++++++------------- 17 files changed, 96 insertions(+), 122 deletions(-) diff --git a/include/gpu/GrBackendSurface.h b/include/gpu/GrBackendSurface.h index 0145dc44c0..7bab31d0dd 100644 --- a/include/gpu/GrBackendSurface.h +++ b/include/gpu/GrBackendSurface.h @@ -138,7 +138,10 @@ public: // Returns true if the backend texture has been initialized. bool isValid() const { return fConfig != kUnknown_GrPixelConfig; } - GrPixelConfig testingOnly_getPixelConfig() const; +#if GR_TEST_UTILS + GrPixelConfig getPixelConfig() const { return fConfig; } + void setPixelConfig(GrPixelConfig config) { fConfig = config; } +#endif private: // Friending for access to the GrPixelConfig @@ -149,6 +152,7 @@ private: friend class GrGpu; friend class GrGLGpu; friend class GrVkGpu; + friend class PromiseImageHelper; GrPixelConfig config() const { return fConfig; } int fWidth; // 1)) , fBackend(kVulkan_GrBackend) , fVkInfo(vkInfo) {} @@ -99,7 +99,7 @@ GrBackendTexture::GrBackendTexture(int width, const GrGLTextureInfo& glInfo) : fWidth(width) , fHeight(height) - , fConfig(GrGLSizedFormatToPixelConfig(glInfo.fFormat)) + , fConfig(kUnknown_GrPixelConfig) , fMipMapped(mipMapped) , fBackend(kOpenGL_GrBackend) , fGLInfo(glInfo) {} @@ -159,7 +159,7 @@ GrBackendRenderTarget::GrBackendRenderTarget(int width, , fHeight(height) , fSampleCnt(SkTMax(1, sampleCnt)) , fStencilBits(0) // We always create stencil buffers internally for vulkan - , fConfig(GrVkFormatToPixelConfig(vkInfo.fFormat)) + , fConfig(kUnknown_GrPixelConfig) , fBackend(kVulkan_GrBackend) , fVkInfo(vkInfo) {} #endif @@ -187,7 +187,7 @@ GrBackendRenderTarget::GrBackendRenderTarget(int width, , fHeight(height) , fSampleCnt(SkTMax(1, sampleCnt)) , fStencilBits(stencilBits) - , fConfig(GrGLSizedFormatToPixelConfig(glInfo.fFormat)) + , fConfig(kUnknown_GrPixelConfig) , fBackend(kOpenGL_GrBackend) , fGLInfo(glInfo) {} diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index 9023554b6b..bcea5160e3 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -4410,7 +4410,9 @@ GrBackendTexture GrGLGpu::createTestingOnlyBackendTexture(const void* pixels, in // unbind the texture from the texture unit to avoid asserts GL_CALL(BindTexture(info.fTarget, 0)); - return GrBackendTexture(w, h, mipMapped, info); + GrBackendTexture beTex = GrBackendTexture(w, h, mipMapped, info); + beTex.setPixelConfig(config); + return beTex; } bool GrGLGpu::isTestingOnlyBackendTexture(const GrBackendTexture& tex) const { @@ -4499,7 +4501,9 @@ GrBackendRenderTarget GrGLGpu::createTestingOnlyBackendRenderTarget(int w, int h return {}; } auto stencilBits = SkToInt(this->glCaps().stencilFormats()[sFormatIdx].fStencilBits); - return {w, h, 1, stencilBits, config, info}; + GrBackendRenderTarget beRT = {w, h, 1, stencilBits, info}; + beRT.setPixelConfig(config); + return beRT; } void GrGLGpu::deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget& backendRT) { diff --git a/src/gpu/gl/GrGLRenderTarget.cpp b/src/gpu/gl/GrGLRenderTarget.cpp index de7399bd92..73c5fdf4b3 100644 --- a/src/gpu/gl/GrGLRenderTarget.cpp +++ b/src/gpu/gl/GrGLRenderTarget.cpp @@ -91,8 +91,16 @@ GrBackendRenderTarget GrGLRenderTarget::getBackendRenderTarget() const { numStencilBits = stencil->bits(); } - return GrBackendRenderTarget(this->width(), this->height(), this->numColorSamples(), - numStencilBits, fbi); + GrBackendRenderTarget beRT = GrBackendRenderTarget(this->width(), this->height(), + this->numColorSamples(), numStencilBits, + fbi); +#if GR_TEST_UTILS + // We shouldn't have to set this since the client can't access it and we will handle the config + // correctly if we go through our public SkSurface APIs. However, some of our tests bypass the + // public APIs so we need to set this manually here. + beRT.setPixelConfig(this->config()); +#endif + return beRT; } size_t GrGLRenderTarget::onGpuMemorySize() const { diff --git a/src/gpu/gl/GrGLTexture.cpp b/src/gpu/gl/GrGLTexture.cpp index 0f36dd0f32..771006919b 100644 --- a/src/gpu/gl/GrGLTexture.cpp +++ b/src/gpu/gl/GrGLTexture.cpp @@ -98,7 +98,15 @@ GrBackendObject GrGLTexture::getTextureHandle() const { } GrBackendTexture GrGLTexture::getBackendTexture() const { - return GrBackendTexture(this->width(), this->height(), this->texturePriv().mipMapped(), fInfo); + GrBackendTexture beTex = GrBackendTexture(this->width(), this->height(), + this->texturePriv().mipMapped(), fInfo); +#if GR_TEST_UTILS + // We shouldn't have to set this since the client can't access it and we will handle the config + // correctly if we go through our public SkSurface and SkImage APIs. However, some of our tests + // bypass the public APIs so we need to set this manually here. + beTex.setPixelConfig(this->config()); +#endif + return beTex; } void GrGLTexture::setMemoryBacking(SkTraceMemoryDump* traceMemoryDump, diff --git a/src/gpu/gl/GrGLUtil.cpp b/src/gpu/gl/GrGLUtil.cpp index 6b44402c1b..a268827e23 100644 --- a/src/gpu/gl/GrGLUtil.cpp +++ b/src/gpu/gl/GrGLUtil.cpp @@ -486,38 +486,3 @@ GrGLenum GrToGLStencilFunc(GrStencilTest test) { return gTable[(int)test]; } -GrPixelConfig GrGLSizedFormatToPixelConfig(GrGLenum sizedFormat) { - switch (sizedFormat) { - case GR_GL_R8: - return kAlpha_8_as_Red_GrPixelConfig; - case GR_GL_ALPHA8: - return kAlpha_8_as_Alpha_GrPixelConfig; - case GR_GL_RGBA8: - return kRGBA_8888_GrPixelConfig; - case GR_GL_BGRA8: - return kBGRA_8888_GrPixelConfig; - case GR_GL_SRGB8_ALPHA8: - return kSRGBA_8888_GrPixelConfig; - case GR_GL_RGB565: - return kRGB_565_GrPixelConfig; - case GR_GL_RGB5: - return kRGB_565_GrPixelConfig; - case GR_GL_RGBA4: - return kRGBA_4444_GrPixelConfig; - case GR_GL_RGB10_A2: - return kRGBA_1010102_GrPixelConfig; - case GR_GL_LUMINANCE8: - return kGray_8_GrPixelConfig; - case GR_GL_RGBA32F: - return kRGBA_float_GrPixelConfig; - case GR_GL_RG32F: - return kRG_float_GrPixelConfig; - case GR_GL_R16F: - return kAlpha_half_as_Red_GrPixelConfig; - case GR_GL_RGBA16F: - return kRGBA_half_GrPixelConfig; - default: - return kUnknown_GrPixelConfig; - } -} - diff --git a/src/gpu/gl/GrGLUtil.h b/src/gpu/gl/GrGLUtil.h index 9905d75ef1..88e8901047 100644 --- a/src/gpu/gl/GrGLUtil.h +++ b/src/gpu/gl/GrGLUtil.h @@ -248,6 +248,4 @@ void GrGLClearErr(const GrGLInterface* gl); GrGLenum GrToGLStencilFunc(GrStencilTest test); -GrPixelConfig GrGLSizedFormatToPixelConfig(GrGLenum sizedFormat); - #endif diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index 5e6473e3a4..a7daf39790 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -1422,7 +1422,6 @@ bool GrVkGpu::createTestingOnlyVkImage(GrPixelConfig config, int w, int h, bool barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.image = image; barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, mipLevels, 0, 1}; - initialLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; VK_CALL(CmdPipelineBarrier(cmdBuffer, GrVkMemory::LayoutToPipelineStageFlags(initialLayout), VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, @@ -1430,6 +1429,7 @@ bool GrVkGpu::createTestingOnlyVkImage(GrPixelConfig config, int w, int h, bool 0, nullptr, 0, nullptr, 1, &barrier)); + initialLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; } // End CommandBuffer @@ -1498,7 +1498,9 @@ GrBackendTexture GrVkGpu::createTestingOnlyBackendTexture(const void* srcData, i &info)) { return {}; } - return GrBackendTexture(w, h, info); + GrBackendTexture beTex = GrBackendTexture(w, h, info); + beTex.setPixelConfig(config); + return beTex; } bool GrVkGpu::isTestingOnlyBackendTexture(const GrBackendTexture& tex) const { @@ -1541,7 +1543,9 @@ GrBackendRenderTarget GrVkGpu::createTestingOnlyBackendRenderTarget(int w, int h &info)) { return {}; } - return {w, h, 1, 0, info}; + GrBackendRenderTarget beRT = {w, h, 1, 0, info}; + beRT.setPixelConfig(config); + return beRT; } void GrVkGpu::deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget& rt) { diff --git a/src/gpu/vk/GrVkRenderTarget.cpp b/src/gpu/vk/GrVkRenderTarget.cpp index 99b6b7632c..9c57ec01bd 100644 --- a/src/gpu/vk/GrVkRenderTarget.cpp +++ b/src/gpu/vk/GrVkRenderTarget.cpp @@ -352,8 +352,16 @@ GrBackendRenderTarget GrVkRenderTarget::getBackendRenderTarget() const { if (GrStencilAttachment* stencil = this->renderTargetPriv().getStencilAttachment()) { numStencilBits = stencil->bits(); } - return GrBackendRenderTarget(this->width(), this->height(), this->numColorSamples(), - numStencilBits, fInfo); + GrBackendRenderTarget beRT = GrBackendRenderTarget(this->width(), this->height(), + this->numColorSamples(), numStencilBits, + fInfo); +#if GR_TEST_UTILS + // We shouldn't have to set this since the client can't access it and we will handle the config + // correctly if we go through our public SkSurface APIs. However, some of our tests bypass the + // public APIs so we need to set this manually here. + beRT.setPixelConfig(this->config()); +#endif + return beRT; } const GrVkResource* GrVkRenderTarget::stencilImageResource() const { diff --git a/src/gpu/vk/GrVkTexture.cpp b/src/gpu/vk/GrVkTexture.cpp index 109b10638d..6668b8f4c1 100644 --- a/src/gpu/vk/GrVkTexture.cpp +++ b/src/gpu/vk/GrVkTexture.cpp @@ -162,7 +162,14 @@ GrBackendObject GrVkTexture::getTextureHandle() const { } GrBackendTexture GrVkTexture::getBackendTexture() const { - return GrBackendTexture(this->width(), this->height(), fInfo); + GrBackendTexture beTex = GrBackendTexture(this->width(), this->height(), fInfo); +#if GR_TEST_UTILS + // We shouldn't have to set this since the client can't access it and we will handle the config + // correctly if we go through our public SkSurface and SkImage APIs. However, some of our tests + // bypass the public APIs so we need to set this manually here. + beTex.setPixelConfig(this->config()); +#endif + return beTex; } GrVkGpu* GrVkTexture::getVkGpu() const { diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp index 4f0acdb8f4..5edb2e3818 100644 --- a/src/gpu/vk/GrVkUtil.cpp +++ b/src/gpu/vk/GrVkUtil.cpp @@ -72,40 +72,6 @@ bool GrPixelConfigToVkFormat(GrPixelConfig config, VkFormat* format) { return false; } -GrPixelConfig GrVkFormatToPixelConfig(VkFormat format) { - switch (format) { - case VK_FORMAT_R8G8B8A8_UNORM: - return kRGBA_8888_GrPixelConfig; - case VK_FORMAT_B8G8R8A8_UNORM: - return kBGRA_8888_GrPixelConfig; - case VK_FORMAT_R8G8B8A8_SRGB: - return kSRGBA_8888_GrPixelConfig; - case VK_FORMAT_B8G8R8A8_SRGB: - return kSBGRA_8888_GrPixelConfig; - case VK_FORMAT_A2B10G10R10_UNORM_PACK32: - return kRGBA_1010102_GrPixelConfig; - case VK_FORMAT_R5G6B5_UNORM_PACK16: - return kRGB_565_GrPixelConfig; - break; - case VK_FORMAT_B4G4R4A4_UNORM_PACK16: - // R4G4B4A4 is not required to be supported so we actually - // store RGBA_4444 data as B4G4R4A4. - return kRGBA_4444_GrPixelConfig; - case VK_FORMAT_R8_UNORM: - return kAlpha_8_GrPixelConfig; - case VK_FORMAT_R32G32B32A32_SFLOAT: - return kRGBA_float_GrPixelConfig; - case VK_FORMAT_R32G32_SFLOAT: - return kRG_float_GrPixelConfig; - case VK_FORMAT_R16G16B16A16_SFLOAT: - return kRGBA_half_GrPixelConfig; - case VK_FORMAT_R16_SFLOAT: - return kAlpha_half_GrPixelConfig; - default: - return kUnknown_GrPixelConfig; - } -} - bool GrVkFormatPixelConfigPairIsValid(VkFormat format, GrPixelConfig config) { switch (format) { case VK_FORMAT_R8G8B8A8_UNORM: diff --git a/src/gpu/vk/GrVkUtil.h b/src/gpu/vk/GrVkUtil.h index 01688c8486..b0d118adb5 100644 --- a/src/gpu/vk/GrVkUtil.h +++ b/src/gpu/vk/GrVkUtil.h @@ -32,11 +32,6 @@ class GrVkGpu; */ bool GrPixelConfigToVkFormat(GrPixelConfig config, VkFormat* format); -/** -* Returns the GrPixelConfig for the given vulkan texture format -*/ -GrPixelConfig GrVkFormatToPixelConfig(VkFormat format); - bool GrVkFormatIsSupported(VkFormat); /** diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 7c842f69c0..45906009f8 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -589,7 +589,7 @@ public: this->resetReleaseHelper(); } - sk_sp getTexture(GrResourceProvider* resourceProvider) { + sk_sp getTexture(GrResourceProvider* resourceProvider, GrPixelConfig config) { // Releases the promise helper if there are no outstanding hard refs. This means that we // don't have any ReleaseProcs waiting to be called so we will need to do a fulfill. if (fReleaseHelper && fReleaseHelper->weak_expired()) { @@ -599,6 +599,7 @@ public: sk_sp tex; if (!fReleaseHelper) { fFulfillProc(fContext, &fBackendTex); + fBackendTex.fConfig = config; if (!fBackendTex.isValid()) { // Even though the GrBackendTexture is not valid, we must call the release // proc to keep our contract of always calling Fulfill and Release in pairs. @@ -700,13 +701,13 @@ sk_sp SkImage_Gpu::MakePromiseTexture(GrContext* context, PromiseImageHelper promiseHelper(textureFulfillProc, textureReleaseProc, textureContext); sk_sp proxy = proxyProvider->createLazyProxy( - [promiseHelper] (GrResourceProvider* resourceProvider) mutable { + [promiseHelper, config] (GrResourceProvider* resourceProvider) mutable { if (!resourceProvider) { promiseHelper.reset(); return sk_sp(); } - return promiseHelper.getTexture(resourceProvider); + return promiseHelper.getTexture(resourceProvider, config); }, desc, origin, mipMapped, GrRenderTargetFlags::kNone, SkBackingFit::kExact, SkBudgeted::kNo, GrSurfaceProxy::LazyInstantiationType::kUninstantiate); diff --git a/tests/ProxyTest.cpp b/tests/ProxyTest.cpp index 4970e43a20..5092abebe6 100644 --- a/tests/ProxyTest.cpp +++ b/tests/ProxyTest.cpp @@ -215,7 +215,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) { sk_sp sProxy( proxyProvider->wrapBackendRenderTarget(backendRT, origin)); check_surface(reporter, sProxy.get(), origin, kWidthHeight, kWidthHeight, - backendRT.testingOnly_getPixelConfig(), SkBudgeted::kNo); + backendRT.getPixelConfig(), SkBudgeted::kNo); static constexpr int kExpectedNumSamples = 1; check_rendertarget(reporter, caps, resourceProvider, sProxy->asRenderTargetProxy(), kExpectedNumSamples, SkBackingFit::kExact, @@ -244,7 +244,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) { proxyProvider->wrapBackendRenderTarget(backendRT, origin)); check_surface(reporter, sProxy.get(), origin, kWidthHeight, kWidthHeight, - backendRT.testingOnly_getPixelConfig(), SkBudgeted::kNo); + backendRT.getPixelConfig(), SkBudgeted::kNo); check_rendertarget(reporter, caps, resourceProvider, sProxy->asRenderTargetProxy(), supportedNumSamples, SkBackingFit::kExact, 0); @@ -265,7 +265,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) { check_surface(reporter, sProxy.get(), origin, kWidthHeight, kWidthHeight, - backendTex.testingOnly_getPixelConfig(), SkBudgeted::kNo); + backendTex.getPixelConfig(), SkBudgeted::kNo); check_rendertarget(reporter, caps, resourceProvider, sProxy->asRenderTargetProxy(), supportedNumSamples, SkBackingFit::kExact, @@ -290,7 +290,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) { check_surface(reporter, sProxy.get(), origin, kWidthHeight, kWidthHeight, - backendTex.testingOnly_getPixelConfig(), SkBudgeted::kNo); + backendTex.getPixelConfig(), SkBudgeted::kNo); check_rendertarget(reporter, caps, resourceProvider, sProxy->asRenderTargetProxy(), supportedNumSamples, SkBackingFit::kExact, @@ -316,7 +316,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(WrappedProxyTest, reporter, ctxInfo) { check_surface(reporter, sProxy.get(), origin, kWidthHeight, kWidthHeight, - backendTex.testingOnly_getPixelConfig(), SkBudgeted::kNo); + backendTex.getPixelConfig(), SkBudgeted::kNo); check_texture(reporter, resourceProvider, sProxy->asTextureProxy(), SkBackingFit::kExact); diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp index bd3090cc8e..955a5c550a 100644 --- a/tests/SurfaceTest.cpp +++ b/tests/SurfaceTest.cpp @@ -205,6 +205,8 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrContext_maxSurfaceSamplesForColorType, repo ->accessRenderTargetContext() ->numStencilSamples(); REPORTER_ASSERT(reporter, sampleCnt == max, "Exected: %d, actual: %d", max, sampleCnt); + + gpu->deleteTestingOnlyBackendTexture(backendTex); } } #endif diff --git a/tests/VkWrapTests.cpp b/tests/VkWrapTests.cpp index 367fdb5c53..58270cd7da 100644 --- a/tests/VkWrapTests.cpp +++ b/tests/VkWrapTests.cpp @@ -46,6 +46,7 @@ void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) { GrVkImageInfo backendCopy = *imageInfo; backendCopy.fImage = VK_NULL_HANDLE; GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy); + backendTex.setPixelConfig(kPixelConfig); tex = gpu->wrapBackendTexture(backendTex, kBorrow_GrWrapOwnership); REPORTER_ASSERT(reporter, !tex); tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership); @@ -57,6 +58,7 @@ void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) { GrVkImageInfo backendCopy = *imageInfo; backendCopy.fAlloc = GrVkAlloc(); GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy); + backendTex.setPixelConfig(kPixelConfig); tex = gpu->wrapBackendTexture(backendTex, kBorrow_GrWrapOwnership); REPORTER_ASSERT(reporter, !tex); tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership); @@ -67,6 +69,7 @@ void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) { { GrVkImageInfo backendCopy = *imageInfo; GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy); + backendTex.setPixelConfig(kPixelConfig); tex = gpu->wrapBackendTexture(backendTex, kAdopt_GrWrapOwnership); REPORTER_ASSERT(reporter, tex); @@ -76,12 +79,11 @@ void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) { void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) { GrVkGpu* gpu = static_cast(context->contextPriv().getGpu()); - GrBackendTexture origBackendTex = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, - kPixelConfig, true, - GrMipMapped::kNo); - const GrVkImageInfo* imageInfo = origBackendTex.getVkImageInfo(); + GrBackendRenderTarget origBackendRT = gpu->createTestingOnlyBackendRenderTarget( + kW, kH, GrColorType::kRGBA_8888, GrSRGBEncoded::kNo); - GrBackendRenderTarget origBackendRT(kW, kH, 1, 0, *imageInfo); + const GrVkImageInfo* imageInfo = origBackendRT.getVkImageInfo(); + GrPixelConfig pixelConfig = origBackendRT.getPixelConfig(); sk_sp rt = gpu->wrapBackendRenderTarget(origBackendRT); REPORTER_ASSERT(reporter, rt); @@ -91,6 +93,7 @@ void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) { GrVkImageInfo backendCopy = *imageInfo; backendCopy.fImage = VK_NULL_HANDLE; GrBackendRenderTarget backendRT(kW, kH, 1, 0, backendCopy); + backendRT.setPixelConfig(pixelConfig); rt = gpu->wrapBackendRenderTarget(backendRT); REPORTER_ASSERT(reporter, !rt); } @@ -101,13 +104,12 @@ void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) { backendCopy.fAlloc = GrVkAlloc(); // can wrap null alloc GrBackendRenderTarget backendRT(kW, kH, 1, 0, backendCopy); + backendRT.setPixelConfig(pixelConfig); rt = gpu->wrapBackendRenderTarget(backendRT); REPORTER_ASSERT(reporter, rt); } - // When we wrapBackendRenderTarget it is always borrowed, so we must make sure to free the - // resource when we're done. - gpu->deleteTestingOnlyBackendTexture(origBackendTex); + gpu->deleteTestingOnlyBackendRenderTarget(origBackendRT); } void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) { @@ -127,6 +129,7 @@ void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) { GrVkImageInfo backendCopy = *imageInfo; backendCopy.fImage = VK_NULL_HANDLE; GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy); + backendTex.setPixelConfig(kPixelConfig); tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kBorrow_GrWrapOwnership); REPORTER_ASSERT(reporter, !tex); tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kAdopt_GrWrapOwnership); @@ -138,6 +141,7 @@ void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) { GrVkImageInfo backendCopy = *imageInfo; backendCopy.fAlloc = GrVkAlloc(); GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy); + backendTex.setPixelConfig(kPixelConfig); tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kBorrow_GrWrapOwnership); REPORTER_ASSERT(reporter, !tex); tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kAdopt_GrWrapOwnership); @@ -148,6 +152,7 @@ void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) { { GrVkImageInfo backendCopy = *imageInfo; GrBackendTexture backendTex = GrBackendTexture(kW, kH, backendCopy); + backendTex.setPixelConfig(kPixelConfig); tex = gpu->wrapRenderableBackendTexture(backendTex, 1, kAdopt_GrWrapOwnership); REPORTER_ASSERT(reporter, tex); } diff --git a/tools/gpu/GrTest.cpp b/tools/gpu/GrTest.cpp index e1a7924062..dfb8c2d4f6 100644 --- a/tools/gpu/GrTest.cpp +++ b/tools/gpu/GrTest.cpp @@ -56,26 +56,32 @@ void SetupAlwaysEvictAtlas(GrContext* context, int dim) { GrBackendTexture CreateBackendTexture(GrBackend backend, int width, int height, GrPixelConfig config, GrMipMapped mipMapped, GrBackendObject handle) { + GrBackendTexture beTex; switch (backend) { #ifdef SK_VULKAN case kVulkan_GrBackend: { GrVkImageInfo* vkInfo = (GrVkImageInfo*)(handle); SkASSERT((GrMipMapped::kYes == mipMapped) == (vkInfo->fLevelCount > 1)); - return GrBackendTexture(width, height, *vkInfo); + beTex = GrBackendTexture(width, height, *vkInfo); + break; } #endif case kOpenGL_GrBackend: { GrGLTextureInfo* glInfo = (GrGLTextureInfo*)(handle); SkASSERT(glInfo->fFormat); - return GrBackendTexture(width, height, mipMapped, *glInfo); + beTex = GrBackendTexture(width, height, mipMapped, *glInfo); + break; } case kMock_GrBackend: { GrMockTextureInfo* mockInfo = (GrMockTextureInfo*)(handle); - return GrBackendTexture(width, height, mipMapped, *mockInfo); + beTex = GrBackendTexture(width, height, mipMapped, *mockInfo); + break; } default: return GrBackendTexture(); } + beTex.setPixelConfig(config); + return beTex; } GrBackendFormat CreateBackendFormatFromTexture(const GrBackendTexture& tex) { @@ -338,16 +344,6 @@ void GrDrawingManager::testingOnly_removeOnFlushCallbackObject(GrOnFlushCallback ////////////////////////////////////////////////////////////////////////////// -GrPixelConfig GrBackendTexture::testingOnly_getPixelConfig() const { - return fConfig; -} - -GrPixelConfig GrBackendRenderTarget::testingOnly_getPixelConfig() const { - return fConfig; -} - -////////////////////////////////////////////////////////////////////////////// - #define DRAW_OP_TEST_EXTERN(Op) \ extern std::unique_ptr Op##__Test(GrPaint&&, SkRandom*, GrContext*, GrFSAAType) #define DRAW_OP_TEST_ENTRY(Op) Op##__Test -- cgit v1.2.3