diff options
-rw-r--r-- | src/gpu/GrGpu.h | 3 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 2 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.h | 3 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 17 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.h | 3 | ||||
-rw-r--r-- | tests/SurfaceTest.cpp | 6 | ||||
-rw-r--r-- | tests/VkWrapTests.cpp | 9 | ||||
-rw-r--r-- | tools/gpu/GrTest.cpp | 2 |
8 files changed, 32 insertions, 13 deletions
diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h index 5164b71f69..a733f45e3c 100644 --- a/src/gpu/GrGpu.h +++ b/src/gpu/GrGpu.h @@ -423,7 +423,8 @@ public: only to be used for testing (particularly for testing the methods that import an externally created texture into Skia. Must be matched with a call to deleteTestingOnlyTexture(). */ virtual GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h, - GrPixelConfig config) = 0; + GrPixelConfig config, + bool isRenderTarget = false) = 0; /** Check a handle represents an actual texture in the backend API that has not been freed. */ virtual bool isTestingOnlyBackendTexture(GrBackendObject) const = 0; /** If ownership of the backend texture has been transferred pass true for abandonTexture. This diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index acc2e31e88..b6add43b23 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -4532,7 +4532,7 @@ void GrGLGpu::xferBarrier(GrRenderTarget* rt, GrXferBarrierType type) { } GrBackendObject GrGLGpu::createTestingOnlyBackendTexture(void* pixels, int w, int h, - GrPixelConfig config) { + GrPixelConfig config, bool /*isRT*/) { if (!this->caps()->isConfigTexturable(config)) { return false; } diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h index aead715d1e..4df2de066f 100644 --- a/src/gpu/gl/GrGLGpu.h +++ b/src/gpu/gl/GrGLGpu.h @@ -133,7 +133,8 @@ public: int height) override; GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h, - GrPixelConfig config) override; + GrPixelConfig config, + bool isRenderTarget = false) override; bool isTestingOnlyBackendTexture(GrBackendObject) const override; void deleteTestingOnlyBackendTexture(GrBackendObject, bool abandonTexture) override; diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index 33437415a9..0bb99c0517 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -540,6 +540,10 @@ GrTexture* GrVkGpu::onCreateTexture(const GrSurfaceDesc& desc, SkBudgeted budget return nullptr; } + if (renderTarget && !fVkCaps->isConfigRenderable(desc.fConfig, false)) { + return nullptr; + } + bool linearTiling = false; if (SkToBool(desc.fFlags & kZeroCopy_GrSurfaceFlag)) { // we can't have a linear texture with a mipmap @@ -842,7 +846,8 @@ GrStencilAttachment* GrVkGpu::createStencilAttachmentForRenderTarget(const GrRen //////////////////////////////////////////////////////////////////////////////// GrBackendObject GrVkGpu::createTestingOnlyBackendTexture(void* srcData, int w, int h, - GrPixelConfig config) { + GrPixelConfig config, + bool isRenderTarget) { VkFormat pixelFormat; if (!GrPixelConfigToVkFormat(config, &pixelFormat)) { @@ -854,7 +859,12 @@ GrBackendObject GrVkGpu::createTestingOnlyBackendTexture(void* srcData, int w, i return 0; } - if (fVkCaps->isConfigTexurableLinearly(config)) { + if (isRenderTarget && !fVkCaps->isConfigRenderable(config, false)) { + return 0; + } + + if (fVkCaps->isConfigTexurableLinearly(config) && + (!isRenderTarget || fVkCaps->isConfigRenderableLinearly(config, false))) { linearTiling = true; } @@ -866,6 +876,9 @@ GrBackendObject GrVkGpu::createTestingOnlyBackendTexture(void* srcData, int w, i VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_SAMPLED_BIT; usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; usageFlags |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; + if (isRenderTarget) { + usageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + } VkImage image = VK_NULL_HANDLE; GrVkAlloc alloc = { VK_NULL_HANDLE, 0, 0 }; diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h index a9470aee14..011189aadd 100644 --- a/src/gpu/vk/GrVkGpu.h +++ b/src/gpu/vk/GrVkGpu.h @@ -80,7 +80,8 @@ public: void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {} GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h, - GrPixelConfig config) override; + GrPixelConfig config, + bool isRenderTarget) override; bool isTestingOnlyBackendTexture(GrBackendObject id) const override; void deleteTestingOnlyBackendTexture(GrBackendObject id, bool abandonTexture) override; diff --git a/tests/SurfaceTest.cpp b/tests/SurfaceTest.cpp index bcfd0a9387..bf6445f00c 100644 --- a/tests/SurfaceTest.cpp +++ b/tests/SurfaceTest.cpp @@ -360,7 +360,7 @@ DEF_GPUTEST_FOR_RENDERING_CONTEXTS(UniqueImageSnapshot_Gpu, reporter, ctxInfo) { // Test again with a "direct" render target; GrBackendObject textureObject = context->getGpu()->createTestingOnlyBackendTexture(nullptr, - 10, 10, kRGBA_8888_GrPixelConfig); + 10, 10, kRGBA_8888_GrPixelConfig, true); GrBackendTextureDesc desc; desc.fConfig = kRGBA_8888_GrPixelConfig; desc.fWidth = 10; @@ -764,7 +764,7 @@ static sk_sp<SkSurface> create_gpu_surface_backend_texture( desc.fHeight = kHeight; desc.fFlags = kRenderTarget_GrBackendTextureFlag; desc.fTextureHandle = context->getGpu()->createTestingOnlyBackendTexture( - pixels.get(), kWidth, kHeight, kRGBA_8888_GrPixelConfig); + pixels.get(), kWidth, kHeight, kRGBA_8888_GrPixelConfig, true); desc.fSampleCnt = sampleCnt; sk_sp<SkSurface> surface = SkSurface::MakeFromBackendTexture(context, desc, nullptr); if (!surface) { @@ -787,7 +787,7 @@ static sk_sp<SkSurface> create_gpu_surface_backend_texture_as_render_target( desc.fHeight = kHeight; desc.fFlags = kRenderTarget_GrBackendTextureFlag; desc.fTextureHandle = context->getGpu()->createTestingOnlyBackendTexture( - pixels.get(), kWidth, kHeight, kRGBA_8888_GrPixelConfig); + pixels.get(), kWidth, kHeight, kRGBA_8888_GrPixelConfig, true); desc.fSampleCnt = sampleCnt; sk_sp<SkSurface> surface = SkSurface::MakeFromBackendTextureAsRenderTarget(context, desc, nullptr); diff --git a/tests/VkWrapTests.cpp b/tests/VkWrapTests.cpp index 852597edc0..fb434a2f26 100644 --- a/tests/VkWrapTests.cpp +++ b/tests/VkWrapTests.cpp @@ -29,7 +29,8 @@ void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) { GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu()); - GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig); + GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig, + false); const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj); // check basic borrowed creation @@ -71,7 +72,8 @@ void wrap_tex_test(skiatest::Reporter* reporter, GrContext* context) { void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) { GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu()); - GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig); + GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig, + true); const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj); // check basic borrowed creation @@ -118,7 +120,8 @@ void wrap_rt_test(skiatest::Reporter* reporter, GrContext* context) { void wrap_trt_test(skiatest::Reporter* reporter, GrContext* context) { GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu()); - GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig); + GrBackendObject backendObj = gpu->createTestingOnlyBackendTexture(nullptr, kW, kH, kPixelConfig, + true); const GrVkImageInfo* backendTex = reinterpret_cast<const GrVkImageInfo*>(backendObj); // check basic borrowed creation diff --git a/tools/gpu/GrTest.cpp b/tools/gpu/GrTest.cpp index 6a637efc61..97a9c49666 100644 --- a/tools/gpu/GrTest.cpp +++ b/tools/gpu/GrTest.cpp @@ -376,7 +376,7 @@ private: void clearStencil(GrRenderTarget* target) override {} GrBackendObject createTestingOnlyBackendTexture(void* pixels, int w, int h, - GrPixelConfig config) override { + GrPixelConfig config, bool isRT) override { return 0; } bool isTestingOnlyBackendTexture(GrBackendObject ) const override { return false; } |