3
#include "Common/Vulkan/VulkanLoader.h"
7
class FramebufferManagerVulkan;
9
struct VulkanDynamicState {
16
uint8_t stencilWriteMask;
17
uint8_t stencilCompareMask;
20
// Let's pack this tight using bitfields.
21
// If an enable flag is set to 0, all the data fields for that section should
24
// Can't use enums unfortunately, they end up signed and breaking values above half their ranges.
25
struct VulkanPipelineRasterStateKey {
27
unsigned int blendEnable : 1;
28
unsigned int srcColor : 5; // VkBlendFactor
29
unsigned int destColor : 5; // VkBlendFactor
30
unsigned int srcAlpha : 5; // VkBlendFactor
31
unsigned int destAlpha : 5; // VkBlendFactor
32
// bool useBlendConstant : 1; // sacrifice a bit to cheaply check if we need to update the blend color
33
unsigned int blendOpColor : 3; // VkBlendOp
34
unsigned int blendOpAlpha : 3; // VkBlendOp
35
unsigned int logicOpEnable : 1;
36
unsigned int logicOp : 4; // VkLogicOp
37
unsigned int colorWriteMask : 4;
40
unsigned int depthTestEnable : 1;
41
unsigned int depthWriteEnable : 1;
42
unsigned int depthCompareOp : 3; // VkCompareOp
43
unsigned int stencilTestEnable : 1;
44
unsigned int stencilCompareOp : 3; // VkCompareOp
45
unsigned int stencilPassOp : 4; // VkStencilOp
46
unsigned int stencilFailOp : 4; // VkStencilOp
47
unsigned int stencilDepthFailOp : 4; // VkStencilOp
49
// We'll use dynamic state for writemask, reference and comparemask to start with,
50
// and viewport/scissor.
53
unsigned int cullMode : 2; // VkCullModeFlagBits
54
unsigned int topology : 4; // VkPrimitiveTopology
56
bool operator < (const VulkanPipelineRasterStateKey &other) const {
57
size_t size = sizeof(VulkanPipelineRasterStateKey);
58
return memcmp(this, &other, size) < 0;
62
class ShaderManagerVulkan;
63
void ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManager, ShaderManagerVulkan *shaderManager, int prim, VulkanPipelineRasterStateKey &key, VulkanDynamicState &dynState);