2019-10-07 11:26:05 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "dxvk_limits.h"
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
namespace dxvk {
|
|
|
|
|
2019-10-07 11:30:46 +02:00
|
|
|
/**
|
|
|
|
* \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;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2019-10-07 11:26:05 +02:00
|
|
|
/**
|
|
|
|
* \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 !std::memcmp(this, &other, sizeof(*this));
|
|
|
|
}
|
|
|
|
|
|
|
|
bool operator != (const DxvkGraphicsPipelineStateInfo& other) const {
|
|
|
|
return std::memcmp(this, &other, sizeof(*this));
|
|
|
|
}
|
|
|
|
|
|
|
|
bool useDynamicStencilRef() const {
|
|
|
|
return dsEnableStencilTest;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool useDynamicDepthBias() const {
|
|
|
|
return rsDepthBiasEnable;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool useDynamicDepthBounds() const {
|
|
|
|
return dsEnableDepthBoundsTest;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool useDynamicBlendConstants() const {
|
|
|
|
bool result = false;
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < MaxNumRenderTargets && !result; i++) {
|
|
|
|
result |= omBlendAttachments[i].blendEnable
|
|
|
|
&& (util::isBlendConstantBlendFactor(omBlendAttachments[i].srcColorBlendFactor)
|
|
|
|
|| util::isBlendConstantBlendFactor(omBlendAttachments[i].dstColorBlendFactor)
|
|
|
|
|| util::isBlendConstantBlendFactor(omBlendAttachments[i].srcAlphaBlendFactor)
|
|
|
|
|| util::isBlendConstantBlendFactor(omBlendAttachments[i].dstAlphaBlendFactor));
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
DxvkBindingMask bsBindingMask;
|
2019-10-07 11:30:46 +02:00
|
|
|
DxvkIaInfo ia;
|
2019-10-07 11:26:05 +02:00
|
|
|
|
|
|
|
uint32_t ilAttributeCount;
|
|
|
|
uint32_t ilBindingCount;
|
|
|
|
VkVertexInputAttributeDescription ilAttributes[DxvkLimits::MaxNumVertexAttributes];
|
|
|
|
VkVertexInputBindingDescription ilBindings[DxvkLimits::MaxNumVertexBindings];
|
|
|
|
uint32_t ilDivisors[DxvkLimits::MaxNumVertexBindings];
|
|
|
|
|
|
|
|
VkBool32 rsDepthClipEnable;
|
|
|
|
VkBool32 rsDepthBiasEnable;
|
|
|
|
VkPolygonMode rsPolygonMode;
|
|
|
|
VkCullModeFlags rsCullMode;
|
|
|
|
VkFrontFace rsFrontFace;
|
|
|
|
uint32_t rsViewportCount;
|
|
|
|
VkSampleCountFlags rsSampleCount;
|
|
|
|
|
|
|
|
VkSampleCountFlags msSampleCount;
|
|
|
|
uint32_t msSampleMask;
|
|
|
|
VkBool32 msEnableAlphaToCoverage;
|
|
|
|
|
|
|
|
VkBool32 dsEnableDepthTest;
|
|
|
|
VkBool32 dsEnableDepthWrite;
|
|
|
|
VkBool32 dsEnableDepthBoundsTest;
|
|
|
|
VkBool32 dsEnableStencilTest;
|
|
|
|
VkCompareOp dsDepthCompareOp;
|
|
|
|
VkStencilOpState dsStencilOpFront;
|
|
|
|
VkStencilOpState dsStencilOpBack;
|
|
|
|
|
|
|
|
VkBool32 omEnableLogicOp;
|
|
|
|
VkLogicOp omLogicOp;
|
|
|
|
VkPipelineColorBlendAttachmentState omBlendAttachments[MaxNumRenderTargets];
|
|
|
|
VkComponentMapping omComponentMapping[MaxNumRenderTargets];
|
|
|
|
|
|
|
|
uint32_t scSpecConstants[MaxNumSpecConstants];
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|