Index: src/gpu/vk/GrVkGpu.cpp |
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp |
index 9528efc8e0333cb99d0251b5f646d9e4f19da400..6b36cdb7c801dd4e7dd09374268a0e5e00ff0e91 100644 |
--- a/src/gpu/vk/GrVkGpu.cpp |
+++ b/src/gpu/vk/GrVkGpu.cpp |
@@ -259,13 +259,15 @@ bool GrVkGpu::onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height, |
bool GrVkGpu::onWritePixels(GrSurface* surface, |
int left, int top, int width, int height, |
- GrPixelConfig config, const void* buffer, |
- size_t rowBytes) { |
+ GrPixelConfig config, |
+ const SkTArray<GrMipLevel>& texels) { |
GrVkTexture* vkTex = static_cast<GrVkTexture*>(surface->asTexture()); |
if (!vkTex) { |
return false; |
} |
+ // TODO: We're ignoring MIP levels here. |
+ |
// We assume Vulkan doesn't do sRGB <-> linear conversions when reading and writing pixels. |
if (GrPixelConfigIsSRGB(surface->config()) != GrPixelConfigIsSRGB(config)) { |
return false; |
@@ -299,7 +301,7 @@ bool GrVkGpu::onWritePixels(GrSurface* surface, |
false); |
} |
success = this->uploadTexData(vkTex, left, top, width, height, config, |
- buffer, rowBytes); |
+ texels.begin()->fPixels, texels.begin()->fRowBytes); |
} |
if (success) { |
@@ -464,7 +466,7 @@ bool GrVkGpu::uploadTexData(GrVkTexture* tex, |
//////////////////////////////////////////////////////////////////////////////// |
GrTexture* GrVkGpu::onCreateTexture(const GrSurfaceDesc& desc, GrGpuResource::LifeCycle lifeCycle, |
- const void* srcData, size_t rowBytes) { |
+ const SkTArray<GrMipLevel>& texels) { |
bool renderTarget = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); |
VkFormat pixelFormat; |
@@ -499,8 +501,8 @@ GrTexture* GrVkGpu::onCreateTexture(const GrSurfaceDesc& desc, GrGpuResource::Li |
// texture. |
usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; |
- VkFlags memProps = (srcData && linearTiling) ? VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT : |
- VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; |
+ VkFlags memProps = (!texels.empty() && linearTiling) ? VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT : |
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; |
// This ImageDesc refers to the texture that will be read by the client. Thus even if msaa is |
// requested, this ImageDesc describes the resolved texutre. Therefore we always have samples set |
@@ -534,9 +536,10 @@ GrTexture* GrVkGpu::onCreateTexture(const GrSurfaceDesc& desc, GrGpuResource::Li |
return nullptr; |
} |
- if (srcData) { |
- if (!this->uploadTexData(tex, 0, 0, desc.fWidth, desc.fHeight, desc.fConfig, srcData, |
- rowBytes)) { |
+ // TODO: We're ignoring MIP levels here. |
+ if (!texels.empty()) { |
+ if (!this->uploadTexData(tex, 0, 0, desc.fWidth, desc.fHeight, desc.fConfig, |
+ texels.begin()->fPixels, texels.begin()->fRowBytes)) { |
tex->unref(); |
return nullptr; |
} |