Commit e0b5a4b0 by Alexis Hetu Committed by Alexis Hétu

Support for combined Depth and Stencil formats

Added implementation for Depth and Stencil which currently allocates Depth and Stencil as 2 contiguous image planes in memory. Copying to and from depth and stencil planes is now supported which fixes all failures in: dEQP-VK.api.copy_and_blit.core.image_to_image.all_formats.depth_stencil Which were the last remaining failures in: dEQP-VK.api.copy_and_blit.core.image_to_image Bug b/119620767 Change-Id: Ie90737c219c70d9c8a68c024ed33292812a3b7f4 Reviewed-on: https://swiftshader-review.googlesource.com/c/23209Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com>
parent 0459596b
...@@ -1963,14 +1963,14 @@ namespace sw ...@@ -1963,14 +1963,14 @@ namespace sw
{ {
switch(format) switch(format)
{ {
case VK_FORMAT_D16_UNORM: case VK_FORMAT_D16_UNORM_S8_UINT:
case VK_FORMAT_X8_D24_UNORM_PACK32:
case VK_FORMAT_D32_SFLOAT:
return false;
case VK_FORMAT_D24_UNORM_S8_UINT: case VK_FORMAT_D24_UNORM_S8_UINT:
case VK_FORMAT_S8_UINT: case VK_FORMAT_S8_UINT:
case VK_FORMAT_D32_SFLOAT_S8_UINT: case VK_FORMAT_D32_SFLOAT_S8_UINT:
return true; return true;
case VK_FORMAT_D16_UNORM:
case VK_FORMAT_X8_D24_UNORM_PACK32:
case VK_FORMAT_D32_SFLOAT:
default: default:
return false; return false;
} }
...@@ -1981,13 +1981,13 @@ namespace sw ...@@ -1981,13 +1981,13 @@ namespace sw
switch(format) switch(format)
{ {
case VK_FORMAT_D16_UNORM: case VK_FORMAT_D16_UNORM:
case VK_FORMAT_D16_UNORM_S8_UINT:
case VK_FORMAT_X8_D24_UNORM_PACK32: case VK_FORMAT_X8_D24_UNORM_PACK32:
case VK_FORMAT_D24_UNORM_S8_UINT: case VK_FORMAT_D24_UNORM_S8_UINT:
case VK_FORMAT_D32_SFLOAT: case VK_FORMAT_D32_SFLOAT:
case VK_FORMAT_D32_SFLOAT_S8_UINT: case VK_FORMAT_D32_SFLOAT_S8_UINT:
return true; return true;
case VK_FORMAT_S8_UINT: case VK_FORMAT_S8_UINT:
return false;
default: default:
return false; return false;
} }
......
...@@ -59,17 +59,17 @@ void Buffer::copyFrom(const void* srcMemory, VkDeviceSize pSize, VkDeviceSize pO ...@@ -59,17 +59,17 @@ void Buffer::copyFrom(const void* srcMemory, VkDeviceSize pSize, VkDeviceSize pO
{ {
ASSERT((pSize + pOffset) <= size); ASSERT((pSize + pOffset) <= size);
memcpy(map(pOffset), srcMemory, pSize); memcpy(getOffsetPointer(pOffset), srcMemory, pSize);
} }
void Buffer::copyTo(void* dstMemory, VkDeviceSize pSize, VkDeviceSize pOffset) const void Buffer::copyTo(void* dstMemory, VkDeviceSize pSize, VkDeviceSize pOffset) const
{ {
ASSERT((pSize + pOffset) <= size); ASSERT((pSize + pOffset) <= size);
memcpy(dstMemory, map(pOffset), pSize); memcpy(dstMemory, getOffsetPointer(pOffset), pSize);
} }
void* Buffer::map(VkDeviceSize offset) const void* Buffer::getOffsetPointer(VkDeviceSize offset) const
{ {
return reinterpret_cast<char*>(memory) + offset; return reinterpret_cast<char*>(memory) + offset;
} }
......
...@@ -33,7 +33,7 @@ public: ...@@ -33,7 +33,7 @@ public:
void bind(VkDeviceMemory pDeviceMemory, VkDeviceSize pMemoryOffset); void bind(VkDeviceMemory pDeviceMemory, VkDeviceSize pMemoryOffset);
void copyFrom(const void* srcMemory, VkDeviceSize size, VkDeviceSize offset); void copyFrom(const void* srcMemory, VkDeviceSize size, VkDeviceSize offset);
void copyTo(void* dstMemory, VkDeviceSize size, VkDeviceSize offset) const; void copyTo(void* dstMemory, VkDeviceSize size, VkDeviceSize offset) const;
void* map(VkDeviceSize offset) const; void* getOffsetPointer(VkDeviceSize offset) const;
private: private:
void* memory = nullptr; void* memory = nullptr;
......
...@@ -134,7 +134,7 @@ struct Draw : public CommandBuffer::Command ...@@ -134,7 +134,7 @@ struct Draw : public CommandBuffer::Command
{ {
const auto& vertexInput = executionState.vertexInputBindings[i]; const auto& vertexInput = executionState.vertexInputBindings[i];
Buffer* buffer = Cast(vertexInput.buffer); Buffer* buffer = Cast(vertexInput.buffer);
context.input[i].buffer = buffer ? buffer->map(vertexInput.offset) : nullptr; context.input[i].buffer = buffer ? buffer->getOffsetPointer(vertexInput.offset) : nullptr;
} }
executionState.renderer->setContext(context); executionState.renderer->setContext(context);
......
...@@ -39,8 +39,8 @@ public: ...@@ -39,8 +39,8 @@ public:
const VkMemoryRequirements getMemoryRequirements() const; const VkMemoryRequirements getMemoryRequirements() const;
void bind(VkDeviceMemory pDeviceMemory, VkDeviceSize pMemoryOffset); void bind(VkDeviceMemory pDeviceMemory, VkDeviceSize pMemoryOffset);
void copyTo(VkImage dstImage, const VkImageCopy& pRegion); void copyTo(VkImage dstImage, const VkImageCopy& pRegion);
void copyTo(VkBuffer dstBuffer, const VkBufferImageCopy& pRegion); void copyTo(VkBuffer dstBuffer, const VkBufferImageCopy& region);
void copyFrom(VkBuffer srcBuffer, const VkBufferImageCopy& pRegion); void copyFrom(VkBuffer srcBuffer, const VkBufferImageCopy& region);
void clear(const VkClearValue& clearValue, const VkRect2D& renderArea, const VkImageSubresourceRange& subresourceRange); void clear(const VkClearValue& clearValue, const VkRect2D& renderArea, const VkImageSubresourceRange& subresourceRange);
...@@ -48,12 +48,15 @@ public: ...@@ -48,12 +48,15 @@ public:
VkFormat getFormat() const { return format; } VkFormat getFormat() const { return format; }
private: private:
VkDeviceSize getStorageSize() const; void copy(VkBuffer buffer, const VkBufferImageCopy& region, bool bufferIsSource);
void* getTexelPointer(const VkOffset3D& offset, uint32_t baseArrayLayer) const; VkDeviceSize getStorageSize(const VkImageAspectFlags& flags) const;
VkDeviceSize texelOffsetBytesInStorage(const VkOffset3D& offset, uint32_t baseArrayLayer) const; void* getTexelPointer(const VkOffset3D& offset, uint32_t baseArrayLayer, const VkImageAspectFlags& flags) const;
int rowPitchBytes() const; VkDeviceSize texelOffsetBytesInStorage(const VkOffset3D& offset, uint32_t baseArrayLayer, const VkImageAspectFlags& flags) const;
int slicePitchBytes() const; VkDeviceSize getMemoryOffset(const VkImageAspectFlags& flags) const;
int bytesPerTexel() const; int rowPitchBytes(const VkImageAspectFlags& flags) const;
int slicePitchBytes(const VkImageAspectFlags& flags) const;
int bytesPerTexel(const VkImageAspectFlags& flags) const;
VkFormat getFormat(const VkImageAspectFlags& flags) const;
int getBorder() const; int getBorder() const;
DeviceMemory* deviceMemory = nullptr; DeviceMemory* deviceMemory = nullptr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment