summaryrefslogtreecommitdiffstats
path: root/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_meta_copy.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_meta_copy.h')
-rw-r--r--src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_meta_copy.h209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_meta_copy.h b/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_meta_copy.h
new file mode 100644
index 00000000..c80b7f79
--- /dev/null
+++ b/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_meta_copy.h
@@ -0,0 +1,209 @@
+#pragma once
+
+#include <mutex>
+#include <unordered_map>
+
+#include "../spirv/spirv_code_buffer.h"
+
+#include "dxvk_barrier.h"
+#include "dxvk_cmdlist.h"
+#include "dxvk_hash.h"
+#include "dxvk_resource.h"
+
+namespace dxvk {
+
+ class DxvkDevice;
+
+ /**
+ * \brief Push constants for buffer image copies
+ */
+ struct DxvkCopyBufferImageArgs {
+ VkOffset3D dstOffset; uint32_t pad0;
+ VkOffset3D srcOffset; uint32_t pad1;
+ VkExtent3D extent; uint32_t pad2;
+ VkExtent2D dstSize;
+ VkExtent2D srcSize;
+ };
+
+ /**
+ * \brief Copy pipeline
+ *
+ * Stores the objects for a single pipeline
+ * that is used for fragment shader copies.
+ */
+ struct DxvkMetaCopyPipeline {
+ VkRenderPass renderPass;
+ VkDescriptorSetLayout dsetLayout;
+ VkPipelineLayout pipeLayout;
+ VkPipeline pipeHandle;
+ };
+
+ /**
+ * \brief Copy pipeline key
+ *
+ * Used to look up copy pipelines based
+ * on the copy operation they support.
+ */
+ struct DxvkMetaCopyPipelineKey {
+ VkImageViewType viewType;
+ VkFormat format;
+ VkSampleCountFlagBits samples;
+
+ bool eq(const DxvkMetaCopyPipelineKey& other) const {
+ return this->viewType == other.viewType
+ && this->format == other.format
+ && this->samples == other.samples;
+ }
+
+ size_t hash() const {
+ return (uint32_t(format) << 8)
+ ^ (uint32_t(samples) << 4)
+ ^ (uint32_t(viewType));
+ }
+ };
+
+ /**
+ * \brief Copy framebuffer and render pass
+ *
+ * Creates a framebuffer and render
+ * pass object for an image view.
+ */
+ class DxvkMetaCopyRenderPass : public DxvkResource {
+
+ public:
+
+ DxvkMetaCopyRenderPass(
+ const Rc<vk::DeviceFn>& vkd,
+ const Rc<DxvkImageView>& dstImageView,
+ const Rc<DxvkImageView>& srcImageView,
+ const Rc<DxvkImageView>& srcStencilView,
+ bool discardDst);
+
+ ~DxvkMetaCopyRenderPass();
+
+ VkRenderPass renderPass() const {
+ return m_renderPass;
+ }
+
+ VkFramebuffer framebuffer() const {
+ return m_framebuffer;
+ }
+
+ private:
+
+ Rc<vk::DeviceFn> m_vkd;
+
+ Rc<DxvkImageView> m_dstImageView;
+ Rc<DxvkImageView> m_srcImageView;
+ Rc<DxvkImageView> m_srcStencilView;
+
+ VkRenderPass m_renderPass = VK_NULL_HANDLE;
+ VkFramebuffer m_framebuffer = VK_NULL_HANDLE;
+
+ VkRenderPass createRenderPass(bool discard) const;
+
+ VkFramebuffer createFramebuffer() const;
+
+ };
+
+ /**
+ * \brief Meta copy objects
+ *
+ * Meta copy operations are necessary in order
+ * to copy data between color and depth images.
+ */
+ class DxvkMetaCopyObjects {
+
+ public:
+
+ DxvkMetaCopyObjects(const DxvkDevice* device);
+ ~DxvkMetaCopyObjects();
+
+ /**
+ * \brief Queries color format for d->c copies
+ *
+ * Returns the color format that we need to use
+ * as the destination image view format in case
+ * of depth to color image copies.
+ * \param [in] format Depth format
+ * \returns Corresponding color format
+ */
+ VkFormat getCopyDestinationFormat(
+ VkImageAspectFlags dstAspect,
+ VkImageAspectFlags srcAspect,
+ VkFormat srcFormat) const;
+
+ /**
+ * \brief Creates pipeline for meta copy operation
+ *
+ * \param [in] viewType Image view type
+ * \param [in] dstFormat Destination image format
+ * \param [in] dstSamples Destination sample count
+ * \returns Compatible pipeline for the operation
+ */
+ DxvkMetaCopyPipeline getPipeline(
+ VkImageViewType viewType,
+ VkFormat dstFormat,
+ VkSampleCountFlagBits dstSamples);
+
+ /**
+ * \brief Creates pipeline for buffer image copy
+ * \returns Compute pipeline for buffer image copies
+ */
+ DxvkMetaCopyPipeline getCopyBufferImagePipeline();
+
+ private:
+
+ struct FragShaders {
+ VkShaderModule frag1D = VK_NULL_HANDLE;
+ VkShaderModule frag2D = VK_NULL_HANDLE;
+ VkShaderModule fragMs = VK_NULL_HANDLE;
+ };
+
+ Rc<vk::DeviceFn> m_vkd;
+
+ VkSampler m_sampler;
+
+ VkShaderModule m_shaderVert = VK_NULL_HANDLE;
+ VkShaderModule m_shaderGeom = VK_NULL_HANDLE;
+
+ FragShaders m_color;
+ FragShaders m_depth;
+ FragShaders m_depthStencil;
+
+ dxvk::mutex m_mutex;
+
+ std::unordered_map<
+ DxvkMetaCopyPipelineKey,
+ DxvkMetaCopyPipeline,
+ DxvkHash, DxvkEq> m_pipelines;
+
+ DxvkMetaCopyPipeline m_copyBufferImagePipeline = { };
+
+ VkSampler createSampler() const;
+
+ VkShaderModule createShaderModule(
+ const SpirvCodeBuffer& code) const;
+
+ DxvkMetaCopyPipeline createCopyBufferImagePipeline();
+
+ DxvkMetaCopyPipeline createPipeline(
+ const DxvkMetaCopyPipelineKey& key);
+
+ VkRenderPass createRenderPass(
+ const DxvkMetaCopyPipelineKey& key) const;
+
+ VkDescriptorSetLayout createDescriptorSetLayout(
+ const DxvkMetaCopyPipelineKey& key) const;
+
+ VkPipelineLayout createPipelineLayout(
+ VkDescriptorSetLayout descriptorSetLayout) const;
+
+ VkPipeline createPipelineObject(
+ const DxvkMetaCopyPipelineKey& key,
+ VkPipelineLayout pipelineLayout,
+ VkRenderPass renderPass);
+
+ };
+
+} \ No newline at end of file