Move Blitter ownership from Image to Device
The blitter has a cache which can allow us to reuse already used
routines, so it should be kept in a central location. For that
reason, the blitter ownership was moved from the Image object to
the Device object.
Bug b/117974925
Change-Id: I825853c381dcbc04701b1d9e7dfa376108294221
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/25728
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkDevice.cpp b/src/Vulkan/VkDevice.cpp
index 60e13f1..7891784 100644
--- a/src/Vulkan/VkDevice.cpp
+++ b/src/Vulkan/VkDevice.cpp
@@ -18,6 +18,7 @@
#include "VkDebug.hpp"
#include "VkDescriptorSetLayout.hpp"
#include "VkQueue.hpp"
+#include "Device/Blitter.hpp"
#include <new> // Must #include this to use "placement new"
@@ -50,6 +51,8 @@
// "The ppEnabledLayerNames and enabledLayerCount members of VkDeviceCreateInfo are deprecated and their values must be ignored by implementations."
UNIMPLEMENTED(); // TODO(b/119321052): UNIMPLEMENTED() should be used only for features that must still be implemented. Use a more informational macro here.
}
+
+ blitter = new sw::Blitter();
}
void Device::destroy(const VkAllocationCallbacks* pAllocator)
@@ -60,6 +63,8 @@
}
vk::deallocate(queues, pAllocator);
+
+ delete blitter;
}
size_t Device::ComputeRequiredAllocationSize(const Device::CreateInfo* info)
diff --git a/src/Vulkan/VkDevice.hpp b/src/Vulkan/VkDevice.hpp
index 24e0923..ae096f2 100644
--- a/src/Vulkan/VkDevice.hpp
+++ b/src/Vulkan/VkDevice.hpp
@@ -17,6 +17,11 @@
#include "VkObject.hpp"
+namespace sw
+{
+ class Blitter;
+};
+
namespace vk
{
@@ -46,11 +51,13 @@
VkPhysicalDevice getPhysicalDevice() const { return physicalDevice; }
void updateDescriptorSets(uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites,
uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies);
+ sw::Blitter* getBlitter() const { return blitter; }
private:
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
Queue* queues = nullptr;
uint32_t queueCount = 0;
+ sw::Blitter* blitter = nullptr;
};
using DispatchableDevice = DispatchableObject<Device, VkDevice>;
diff --git a/src/Vulkan/VkImage.cpp b/src/Vulkan/VkImage.cpp
index 463a8f7..22819f4 100644
--- a/src/Vulkan/VkImage.cpp
+++ b/src/Vulkan/VkImage.cpp
@@ -14,6 +14,7 @@
#include "VkDeviceMemory.hpp"
#include "VkBuffer.hpp"
+#include "VkDevice.hpp"
#include "VkImage.hpp"
#include "Device/Blitter.hpp"
#include "Device/Surface.hpp"
@@ -41,18 +42,17 @@
namespace vk
{
-Image::Image(const VkImageCreateInfo* pCreateInfo, void* mem) :
- flags(pCreateInfo->flags),
- imageType(pCreateInfo->imageType),
- format(pCreateInfo->format),
- extent(pCreateInfo->extent),
- mipLevels(pCreateInfo->mipLevels),
- arrayLayers(pCreateInfo->arrayLayers),
- samples(pCreateInfo->samples),
- tiling(pCreateInfo->tiling)
+Image::Image(const Image::CreateInfo* pCreateInfo, void* mem) :
+ device(Cast(pCreateInfo->device)),
+ flags(pCreateInfo->pCreateInfo->flags),
+ imageType(pCreateInfo->pCreateInfo->imageType),
+ format(pCreateInfo->pCreateInfo->format),
+ extent(pCreateInfo->pCreateInfo->extent),
+ mipLevels(pCreateInfo->pCreateInfo->mipLevels),
+ arrayLayers(pCreateInfo->pCreateInfo->arrayLayers),
+ samples(pCreateInfo->pCreateInfo->samples),
+ tiling(pCreateInfo->pCreateInfo->tiling)
{
- blitter = new sw::Blitter();
-
if (samples != VK_SAMPLE_COUNT_1_BIT)
{
UNIMPLEMENTED("Multisample images not yet supported");
@@ -61,10 +61,9 @@
void Image::destroy(const VkAllocationCallbacks* pAllocator)
{
- delete blitter;
}
-size_t Image::ComputeRequiredAllocationSize(const VkImageCreateInfo* pCreateInfo)
+size_t Image::ComputeRequiredAllocationSize(const Image::CreateInfo* pCreateInfo)
{
return 0;
}
@@ -495,7 +494,7 @@
for(int i = 0; i < numSlices; i++)
{
- blitter->blit(srcSurface, sRect, dstSurface, dRect,
+ device->getBlitter()->blit(srcSurface, sRect, dstSurface, dRect,
{filter != VK_FILTER_NEAREST, srcAspect == VK_IMAGE_ASPECT_STENCIL_BIT, false});
sRect.slice++;
dRect.slice++;
@@ -547,7 +546,7 @@
{
const sw::SliceRect dRect(0, 0, mipLevelExtent.width, mipLevelExtent.height, s);
sw::Surface* surface = asSurface(aspect, mipLevel, layer);
- blitter->clear(pixelData, format, surface, dRect, 0xF);
+ device->getBlitter()->clear(pixelData, format, surface, dRect, 0xF);
delete surface;
}
}
@@ -574,7 +573,7 @@
{
dRect.slice = s;
sw::Surface* surface = asSurface(aspect, 0, layer);
- blitter->clear(pixelData, format, surface, dRect, 0xF);
+ device->getBlitter()->clear(pixelData, format, surface, dRect, 0xF);
delete surface;
}
}
diff --git a/src/Vulkan/VkImage.hpp b/src/Vulkan/VkImage.hpp
index d3a77cd..17a9ce8 100644
--- a/src/Vulkan/VkImage.hpp
+++ b/src/Vulkan/VkImage.hpp
@@ -19,23 +19,29 @@
namespace sw
{
- class Blitter;
class Surface;
};
namespace vk
{
+class Device;
class DeviceMemory;
class Image : public Object<Image, VkImage>
{
public:
- Image(const VkImageCreateInfo* pCreateInfo, void* mem);
+ struct CreateInfo
+ {
+ const VkImageCreateInfo* pCreateInfo;
+ const VkDevice device;
+ };
+
+ Image(const CreateInfo* pCreateInfo, void* mem);
~Image() = delete;
void destroy(const VkAllocationCallbacks* pAllocator);
- static size_t ComputeRequiredAllocationSize(const VkImageCreateInfo* pCreateInfo);
+ static size_t ComputeRequiredAllocationSize(const CreateInfo* pCreateInfo);
const VkMemoryRequirements getMemoryRequirements() const;
void getSubresourceLayout(const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout) const;
@@ -77,6 +83,7 @@
void clear(void* pixelData, VkFormat format, const VkImageSubresourceRange& subresourceRange, VkImageAspectFlagBits aspect);
void clear(void* pixelData, VkFormat format, const VkRect2D& renderArea, const VkImageSubresourceRange& subresourceRange, VkImageAspectFlagBits aspect);
+ const Device *const device = nullptr;
DeviceMemory* deviceMemory = nullptr;
VkDeviceSize memoryOffset = 0;
VkImageCreateFlags flags = 0;
@@ -87,7 +94,6 @@
uint32_t arrayLayers = 0;
VkSampleCountFlagBits samples = VK_SAMPLE_COUNT_1_BIT;
VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL;
- sw::Blitter* blitter = nullptr;
};
static inline Image* Cast(VkImage object)
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 26ac1d8..9f23143 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -906,7 +906,13 @@
UNIMPLEMENTED();
}
- return vk::Image::Create(pAllocator, pCreateInfo, pImage);
+ vk::Image::CreateInfo imageCreateInfo =
+ {
+ pCreateInfo,
+ device
+ };
+
+ return vk::Image::Create(pAllocator, &imageCreateInfo, pImage);
}
VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator)