summaryrefslogtreecommitdiffstats
path: root/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_graphics_state.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_graphics_state.h728
1 files changed, 728 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_graphics_state.h b/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_graphics_state.h
new file mode 100644
index 00000000..b10f7835
--- /dev/null
+++ b/src/libs/dxvk-native-1.9.2a/src/dxvk/dxvk_graphics_state.h
@@ -0,0 +1,728 @@
+#pragma once
+
+#include "dxvk_limits.h"
+
+#include <cstring>
+
+namespace dxvk {
+
+ /**
+ * \brief Packed input assembly state
+ *
+ * Stores the primitive topology
+ * and primitive restart info.
+ */
+ class DxvkIaInfo {
+
+ public:
+
+ DxvkIaInfo() = default;
+
+ DxvkIaInfo(
+ VkPrimitiveTopology primitiveTopology,
+ VkBool32 primitiveRestart,
+ uint32_t patchVertexCount)
+ : m_primitiveTopology (uint16_t(primitiveTopology)),
+ m_primitiveRestart (uint16_t(primitiveRestart)),
+ m_patchVertexCount (uint16_t(patchVertexCount)),
+ m_reserved (0) { }
+
+ VkPrimitiveTopology primitiveTopology() const {
+ return m_primitiveTopology <= VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
+ ? VkPrimitiveTopology(m_primitiveTopology)
+ : VK_PRIMITIVE_TOPOLOGY_MAX_ENUM;
+ }
+
+ VkBool32 primitiveRestart() const {
+ return VkBool32(m_primitiveRestart);
+ }
+
+ uint32_t patchVertexCount() const {
+ return m_patchVertexCount;
+ }
+
+ private:
+
+ uint16_t m_primitiveTopology : 4;
+ uint16_t m_primitiveRestart : 1;
+ uint16_t m_patchVertexCount : 6;
+ uint16_t m_reserved : 5;
+
+ };
+
+
+ /**
+ * \brief Packed input layout metadata
+ *
+ * Stores the number of vertex attributes
+ * and bindings in one byte each.
+ */
+ class DxvkIlInfo {
+
+ public:
+
+ DxvkIlInfo() = default;
+
+ DxvkIlInfo(
+ uint32_t attributeCount,
+ uint32_t bindingCount)
+ : m_attributeCount(uint8_t(attributeCount)),
+ m_bindingCount (uint8_t(bindingCount)) { }
+
+ uint32_t attributeCount() const {
+ return m_attributeCount;
+ }
+
+ uint32_t bindingCount() const {
+ return m_bindingCount;
+ }
+
+ private:
+
+ uint8_t m_attributeCount;
+ uint8_t m_bindingCount;
+
+ };
+
+
+ /**
+ * \brief Packed vertex attribute
+ *
+ * Stores a vertex attribute description. Assumes
+ * that all vertex formats have numerical values
+ * of 127 or less (i.e. fit into 7 bits).
+ */
+ class DxvkIlAttribute {
+
+ public:
+
+ DxvkIlAttribute() = default;
+
+ DxvkIlAttribute(
+ uint32_t location,
+ uint32_t binding,
+ VkFormat format,
+ uint32_t offset)
+ : m_location(uint32_t(location)),
+ m_binding (uint32_t(binding)),
+ m_format (uint32_t(format)),
+ m_offset (uint32_t(offset)),
+ m_reserved(0) { }
+
+ uint32_t location() const {
+ return m_location;
+ }
+
+ uint32_t binding() const {
+ return m_binding;
+ }
+
+ VkFormat format() const {
+ return VkFormat(m_format);
+ }
+
+ uint32_t offset() const {
+ return m_offset;
+ }
+
+ VkVertexInputAttributeDescription description() const {
+ VkVertexInputAttributeDescription result;
+ result.location = m_location;
+ result.binding = m_binding;
+ result.format = VkFormat(m_format);
+ result.offset = m_offset;
+ return result;
+ }
+
+ private:
+
+ uint32_t m_location : 5;
+ uint32_t m_binding : 5;
+ uint32_t m_format : 7;
+ uint32_t m_offset : 11;
+ uint32_t m_reserved : 4;
+
+ };
+
+
+ /**
+ * \brief Packed vertex binding
+ *
+ * Stores a vertex binding description,
+ * including the 32-bit divisor.
+ */
+ class DxvkIlBinding {
+
+ public:
+
+ DxvkIlBinding() = default;
+
+ DxvkIlBinding(
+ uint32_t binding,
+ uint32_t stride,
+ VkVertexInputRate inputRate,
+ uint32_t divisor)
+ : m_binding (uint32_t(binding)),
+ m_stride (uint32_t(stride)),
+ m_inputRate (uint32_t(inputRate)),
+ m_divisor (uint32_t(divisor < (1u << 14) ? divisor : 0u)) { }
+
+ uint32_t binding() const {
+ return m_binding;
+ }
+
+ uint32_t stride() const {
+ return m_stride;
+ }
+
+ VkVertexInputRate inputRate() const {
+ return VkVertexInputRate(m_inputRate);
+ }
+
+ uint32_t divisor() const {
+ return m_divisor;
+ }
+
+ VkVertexInputBindingDescription description() const {
+ VkVertexInputBindingDescription result;
+ result.binding = m_binding;
+ result.stride = m_stride;
+ result.inputRate = VkVertexInputRate(m_inputRate);
+ return result;
+ }
+
+ void setStride(uint32_t stride) {
+ m_stride = stride;
+ }
+
+ private:
+
+ uint32_t m_binding : 5;
+ uint32_t m_stride : 12;
+ uint32_t m_inputRate : 1;
+ uint32_t m_divisor : 14;
+
+ };
+
+
+ /**
+ * \brief Packed rasterizer state
+ *
+ * Stores a bunch of flags and parameters
+ * related to rasterization in four bytes.
+ */
+ class DxvkRsInfo {
+
+ public:
+
+ DxvkRsInfo() = default;
+
+ DxvkRsInfo(
+ VkBool32 depthClipEnable,
+ VkBool32 depthBiasEnable,
+ VkPolygonMode polygonMode,
+ VkCullModeFlags cullMode,
+ VkFrontFace frontFace,
+ uint32_t viewportCount,
+ VkSampleCountFlags sampleCount,
+ VkConservativeRasterizationModeEXT conservativeMode)
+ : m_depthClipEnable (uint32_t(depthClipEnable)),
+ m_depthBiasEnable (uint32_t(depthBiasEnable)),
+ m_polygonMode (uint32_t(polygonMode)),
+ m_cullMode (uint32_t(cullMode)),
+ m_frontFace (uint32_t(frontFace)),
+ m_viewportCount (uint32_t(viewportCount)),
+ m_sampleCount (uint32_t(sampleCount)),
+ m_conservativeMode(uint32_t(conservativeMode)),
+ m_reserved (0) { }
+
+ VkBool32 depthClipEnable() const {
+ return VkBool32(m_depthClipEnable);
+ }
+
+ VkBool32 depthBiasEnable() const {
+ return VkBool32(m_depthBiasEnable);
+ }
+
+ VkPolygonMode polygonMode() const {
+ return VkPolygonMode(m_polygonMode);
+ }
+
+ VkCullModeFlags cullMode() const {
+ return VkCullModeFlags(m_cullMode);
+ }
+
+ VkFrontFace frontFace() const {
+ return VkFrontFace(m_frontFace);
+ }
+
+ uint32_t viewportCount() const {
+ return m_viewportCount;
+ }
+
+ VkSampleCountFlags sampleCount() const {
+ return VkSampleCountFlags(m_sampleCount);
+ }
+
+ VkConservativeRasterizationModeEXT conservativeMode() const {
+ return VkConservativeRasterizationModeEXT(m_conservativeMode);
+ }
+
+ void setViewportCount(uint32_t viewportCount) {
+ m_viewportCount = viewportCount;
+ }
+
+ private:
+
+ uint32_t m_depthClipEnable : 1;
+ uint32_t m_depthBiasEnable : 1;
+ uint32_t m_polygonMode : 2;
+ uint32_t m_cullMode : 2;
+ uint32_t m_frontFace : 1;
+ uint32_t m_viewportCount : 5;
+ uint32_t m_sampleCount : 5;
+ uint32_t m_conservativeMode : 2;
+ uint32_t m_reserved : 13;
+
+ };
+
+
+ /**
+ * \brief Packed multisample info
+ *
+ * Stores the sample mask, sample count override
+ * and alpha-to-coverage state in four bytes.
+ */
+ class DxvkMsInfo {
+
+ public:
+
+ DxvkMsInfo() = default;
+
+ DxvkMsInfo(
+ VkSampleCountFlags sampleCount,
+ uint32_t sampleMask,
+ VkBool32 enableAlphaToCoverage)
+ : m_sampleCount (uint16_t(sampleCount)),
+ m_enableAlphaToCoverage (uint16_t(enableAlphaToCoverage)),
+ m_reserved (0),
+ m_sampleMask (uint16_t(sampleMask)) { }
+
+ VkSampleCountFlags sampleCount() const {
+ return VkSampleCountFlags(m_sampleCount);
+ }
+
+ uint32_t sampleMask() const {
+ return m_sampleMask;
+ }
+
+ VkBool32 enableAlphaToCoverage() const {
+ return VkBool32(m_enableAlphaToCoverage);
+ }
+
+ void setSampleCount(VkSampleCountFlags sampleCount) {
+ m_sampleCount = uint16_t(sampleCount);
+ }
+
+ private:
+
+ uint16_t m_sampleCount : 5;
+ uint16_t m_enableAlphaToCoverage : 1;
+ uint16_t m_reserved : 10;
+ uint16_t m_sampleMask;
+
+ };
+
+
+ /**
+ * \brief Packed depth-stencil metadata
+ *
+ * Stores some flags and the depth-compare op in
+ * two bytes. Stencil ops are stored separately.
+ */
+ class DxvkDsInfo {
+
+ public:
+
+ DxvkDsInfo() = default;
+
+ DxvkDsInfo(
+ VkBool32 enableDepthTest,
+ VkBool32 enableDepthWrite,
+ VkBool32 enableDepthBoundsTest,
+ VkBool32 enableStencilTest,
+ VkCompareOp depthCompareOp)
+ : m_enableDepthTest (uint16_t(enableDepthTest)),
+ m_enableDepthWrite (uint16_t(enableDepthWrite)),
+ m_enableDepthBoundsTest (uint16_t(enableDepthBoundsTest)),
+ m_enableStencilTest (uint16_t(enableStencilTest)),
+ m_depthCompareOp (uint16_t(depthCompareOp)),
+ m_reserved (0) { }
+
+ VkBool32 enableDepthTest() const {
+ return VkBool32(m_enableDepthTest);
+ }
+
+ VkBool32 enableDepthWrite() const {
+ return VkBool32(m_enableDepthWrite);
+ }
+
+ VkBool32 enableDepthBoundsTest() const {
+ return VkBool32(m_enableDepthBoundsTest);
+ }
+
+ VkBool32 enableStencilTest() const {
+ return VkBool32(m_enableStencilTest);
+ }
+
+ VkCompareOp depthCompareOp() const {
+ return VkCompareOp(m_depthCompareOp);
+ }
+
+ void setEnableDepthBoundsTest(VkBool32 enableDepthBoundsTest) {
+ m_enableDepthBoundsTest = VkBool32(enableDepthBoundsTest);
+ }
+
+ private:
+
+ uint16_t m_enableDepthTest : 1;
+ uint16_t m_enableDepthWrite : 1;
+ uint16_t m_enableDepthBoundsTest : 1;
+ uint16_t m_enableStencilTest : 1;
+ uint16_t m_depthCompareOp : 3;
+ uint16_t m_reserved : 9;
+
+ };
+
+
+ /**
+ * \brief Packed stencil op
+ *
+ * Stores various stencil op parameters
+ * for one single face in four bytes.
+ */
+ class DxvkDsStencilOp {
+
+ public:
+
+ DxvkDsStencilOp() = default;
+
+ DxvkDsStencilOp(VkStencilOpState state)
+ : m_failOp (uint32_t(state.failOp)),
+ m_passOp (uint32_t(state.passOp)),
+ m_depthFailOp (uint32_t(state.depthFailOp)),
+ m_compareOp (uint32_t(state.compareOp)),
+ m_reserved (0),
+ m_compareMask (uint32_t(state.compareMask)),
+ m_writeMask (uint32_t(state.writeMask)) { }
+
+ VkStencilOpState state() const {
+ VkStencilOpState result;
+ result.failOp = VkStencilOp(m_failOp);
+ result.passOp = VkStencilOp(m_passOp);
+ result.depthFailOp = VkStencilOp(m_depthFailOp);
+ result.compareOp = VkCompareOp(m_compareOp);
+ result.compareMask = m_compareMask;
+ result.writeMask = m_writeMask;
+ result.reference = 0;
+ return result;
+ }
+
+ private:
+
+ uint32_t m_failOp : 3;
+ uint32_t m_passOp : 3;
+ uint32_t m_depthFailOp : 3;
+ uint32_t m_compareOp : 3;
+ uint32_t m_reserved : 4;
+ uint32_t m_compareMask : 8;
+ uint32_t m_writeMask : 8;
+
+ };
+
+
+ /**
+ * \brief Packed output merger metadata
+ *
+ * Stores the logic op state in two bytes.
+ * Blend modes are stored separately.
+ */
+ class DxvkOmInfo {
+
+ public:
+
+ DxvkOmInfo() = default;
+
+ DxvkOmInfo(
+ VkBool32 enableLogicOp,
+ VkLogicOp logicOp)
+ : m_enableLogicOp (uint16_t(enableLogicOp)),
+ m_logicOp (uint16_t(logicOp)),
+ m_reserved (0) { }
+
+ VkBool32 enableLogicOp() const {
+ return VkBool32(m_enableLogicOp);
+ }
+
+ VkLogicOp logicOp() const {
+ return VkLogicOp(m_logicOp);
+ }
+
+ private:
+
+ uint16_t m_enableLogicOp : 1;
+ uint16_t m_logicOp : 4;
+ uint16_t m_reserved : 11;
+
+ };
+
+
+ /**
+ * \brief Packed attachment blend mode
+ *
+ * Stores blendig parameters for a single
+ * color attachment in four bytes.
+ */
+ class DxvkOmAttachmentBlend {
+
+ public:
+
+ DxvkOmAttachmentBlend() = default;
+
+ DxvkOmAttachmentBlend(
+ VkBool32 blendEnable,
+ VkBlendFactor srcColorBlendFactor,
+ VkBlendFactor dstColorBlendFactor,
+ VkBlendOp colorBlendOp,
+ VkBlendFactor srcAlphaBlendFactor,
+ VkBlendFactor dstAlphaBlendFactor,
+ VkBlendOp alphaBlendOp,
+ VkColorComponentFlags colorWriteMask)
+ : m_blendEnable (uint32_t(blendEnable)),
+ m_srcColorBlendFactor (uint32_t(srcColorBlendFactor)),
+ m_dstColorBlendFactor (uint32_t(dstColorBlendFactor)),
+ m_colorBlendOp (uint32_t(colorBlendOp)),
+ m_srcAlphaBlendFactor (uint32_t(srcAlphaBlendFactor)),
+ m_dstAlphaBlendFactor (uint32_t(dstAlphaBlendFactor)),
+ m_alphaBlendOp (uint32_t(alphaBlendOp)),
+ m_colorWriteMask (uint32_t(colorWriteMask)),
+ m_reserved (0) { }
+
+ VkBool32 blendEnable() const {
+ return m_blendEnable;
+ }
+
+ VkBlendFactor srcColorBlendFactor() const {
+ return VkBlendFactor(m_srcColorBlendFactor);
+ }
+
+ VkBlendFactor dstColorBlendFactor() const {
+ return VkBlendFactor(m_dstColorBlendFactor);
+ }
+
+ VkBlendOp colorBlendOp() const {
+ return VkBlendOp(m_colorBlendOp);
+ }
+
+ VkBlendFactor srcAlphaBlendFactor() const {
+ return VkBlendFactor(m_srcAlphaBlendFactor);
+ }
+
+ VkBlendFactor dstAlphaBlendFactor() const {
+ return VkBlendFactor(m_dstAlphaBlendFactor);
+ }
+
+ VkBlendOp alphaBlendOp() const {
+ return VkBlendOp(m_alphaBlendOp);
+ }
+
+ VkColorComponentFlags colorWriteMask() const {
+ return VkColorComponentFlags(m_colorWriteMask);
+ }
+
+ VkPipelineColorBlendAttachmentState state() const {
+ VkPipelineColorBlendAttachmentState result;
+ result.blendEnable = VkBool32(m_blendEnable);
+ result.srcColorBlendFactor = VkBlendFactor(m_srcColorBlendFactor);
+ result.dstColorBlendFactor = VkBlendFactor(m_dstColorBlendFactor);
+ result.colorBlendOp = VkBlendOp(m_colorBlendOp);
+ result.srcAlphaBlendFactor = VkBlendFactor(m_srcAlphaBlendFactor);
+ result.dstAlphaBlendFactor = VkBlendFactor(m_dstAlphaBlendFactor);
+ result.alphaBlendOp = VkBlendOp(m_alphaBlendOp);
+ result.colorWriteMask = VkColorComponentFlags(m_colorWriteMask);
+ return result;
+ }
+
+ private:
+
+ uint32_t m_blendEnable : 1;
+ uint32_t m_srcColorBlendFactor : 5;
+ uint32_t m_dstColorBlendFactor : 5;
+ uint32_t m_colorBlendOp : 3;
+ uint32_t m_srcAlphaBlendFactor : 5;
+ uint32_t m_dstAlphaBlendFactor : 5;
+ uint32_t m_alphaBlendOp : 3;
+ uint32_t m_colorWriteMask : 4;
+ uint32_t m_reserved : 1;
+
+ };
+
+
+ /**
+ * \brief Packed attachment swizzle
+ *
+ * Stores the component mapping for one
+ * single color attachment in one byte.
+ */
+ class DxvkOmAttachmentSwizzle {
+
+ public:
+
+ DxvkOmAttachmentSwizzle() = default;
+
+ DxvkOmAttachmentSwizzle(VkComponentMapping mapping)
+ : m_r(util::getComponentIndex(mapping.r, 0)),
+ m_g(util::getComponentIndex(mapping.g, 1)),
+ m_b(util::getComponentIndex(mapping.b, 2)),
+ m_a(util::getComponentIndex(mapping.a, 3)) { }
+
+ uint32_t rIndex() const { return m_r; }
+ uint32_t gIndex() const { return m_g; }
+ uint32_t bIndex() const { return m_b; }
+ uint32_t aIndex() const { return m_a; }
+
+ VkComponentMapping mapping() const {
+ VkComponentMapping result;
+ result.r = decodeSwizzle(m_r);
+ result.g = decodeSwizzle(m_g);
+ result.b = decodeSwizzle(m_b);
+ result.a = decodeSwizzle(m_a);
+ return result;
+ }
+
+ private:
+
+ uint8_t m_r : 2;
+ uint8_t m_g : 2;
+ uint8_t m_b : 2;
+ uint8_t m_a : 2;
+
+ static VkComponentSwizzle decodeSwizzle(uint8_t swizzle) {
+ return VkComponentSwizzle(uint32_t(swizzle) + uint32_t(VK_COMPONENT_SWIZZLE_R));
+ }
+
+ };
+
+
+ /**
+ * \brief Specialization constant state
+ *
+ * Stores the raw 32-bit spec constant values.
+ */
+ struct DxvkScInfo {
+ uint32_t specConstants[DxvkLimits::MaxNumSpecConstants];
+ };
+
+
+ /**
+ * \brief Packed graphics pipeline state
+ *
+ * Stores a compressed representation of the full
+ * graphics pipeline state which is optimized for
+ * lookup performance.
+ */
+ struct alignas(32) DxvkGraphicsPipelineStateInfo {
+ DxvkGraphicsPipelineStateInfo() {
+ std::memset(this, 0, sizeof(*this));
+ }
+
+ DxvkGraphicsPipelineStateInfo(const DxvkGraphicsPipelineStateInfo& other) {
+ std::memcpy(this, &other, sizeof(*this));
+ }
+
+ DxvkGraphicsPipelineStateInfo& operator = (const DxvkGraphicsPipelineStateInfo& other) {
+ std::memcpy(this, &other, sizeof(*this));
+ return *this;
+ }
+
+ bool operator == (const DxvkGraphicsPipelineStateInfo& other) const {
+ return bit::bcmpeq(this, &other);
+ }
+
+ bool operator != (const DxvkGraphicsPipelineStateInfo& other) const {
+ return !bit::bcmpeq(this, &other);
+ }
+
+ bool useDynamicStencilRef() const {
+ return ds.enableStencilTest();
+ }
+
+ bool useDynamicDepthBias() const {
+ return rs.depthBiasEnable();
+ }
+
+ bool useDynamicDepthBounds() const {
+ return ds.enableDepthBoundsTest();
+ }
+
+ bool useDynamicBlendConstants() const {
+ bool result = false;
+
+ for (uint32_t i = 0; i < MaxNumRenderTargets && !result; i++) {
+ result |= omBlend[i].blendEnable()
+ && (util::isBlendConstantBlendFactor(omBlend[i].srcColorBlendFactor())
+ || util::isBlendConstantBlendFactor(omBlend[i].dstColorBlendFactor())
+ || util::isBlendConstantBlendFactor(omBlend[i].srcAlphaBlendFactor())
+ || util::isBlendConstantBlendFactor(omBlend[i].dstAlphaBlendFactor()));
+ }
+
+ return result;
+ }
+
+ DxvkBindingMask bsBindingMask;
+ DxvkIaInfo ia;
+ DxvkIlInfo il;
+ DxvkRsInfo rs;
+ DxvkMsInfo ms;
+ DxvkDsInfo ds;
+ DxvkOmInfo om;
+ DxvkScInfo sc;
+ DxvkDsStencilOp dsFront;
+ DxvkDsStencilOp dsBack;
+ DxvkOmAttachmentSwizzle omSwizzle [DxvkLimits::MaxNumRenderTargets];
+ DxvkOmAttachmentBlend omBlend [DxvkLimits::MaxNumRenderTargets];
+ DxvkIlAttribute ilAttributes [DxvkLimits::MaxNumVertexAttributes];
+ DxvkIlBinding ilBindings [DxvkLimits::MaxNumVertexBindings];
+ };
+
+
+ /**
+ * \brief Compute pipeline state info
+ */
+ struct alignas(32) DxvkComputePipelineStateInfo {
+ DxvkComputePipelineStateInfo() {
+ std::memset(this, 0, sizeof(*this));
+ }
+
+ DxvkComputePipelineStateInfo(const DxvkComputePipelineStateInfo& other) {
+ std::memcpy(this, &other, sizeof(*this));
+ }
+
+ DxvkComputePipelineStateInfo& operator = (const DxvkComputePipelineStateInfo& other) {
+ std::memcpy(this, &other, sizeof(*this));
+ return *this;
+ }
+
+ bool operator == (const DxvkComputePipelineStateInfo& other) const {
+ return bit::bcmpeq(this, &other);
+ }
+
+ bool operator != (const DxvkComputePipelineStateInfo& other) const {
+ return !bit::bcmpeq(this, &other);
+ }
+
+ DxvkBindingMask bsBindingMask;
+ DxvkScInfo sc;
+ };
+
+}