Add support for VK_KHR_fragment_shading_rate. Closes #2426

This commit is contained in:
baldurk
2022-02-04 16:26:35 +00:00
parent e58cb9a73b
commit 6ab4c1ad74
23 changed files with 639 additions and 42 deletions
@@ -872,7 +872,6 @@ void VulkanPipelineStateViewer::clearState()
ui->lineWidth->setText(lit("1.0"));
ui->conservativeRaster->setText(tr("Disabled"));
ui->overestimationSize->setText(lit("0.0"));
ui->multiview->setText(tr("Disabled"));
ui->stippleFactor->setText(QString());
@@ -880,6 +879,9 @@ void VulkanPipelineStateViewer::clearState()
ui->stipplePattern->setText(QString());
ui->stipplePattern->setPixmap(cross);
ui->pipelineShadingRate->setText(tr("1x1"));
ui->shadingRateCombiners->setText(tr("Keep, Keep"));
ui->sampleCount->setText(lit("1"));
ui->sampleShading->setPixmap(tick);
ui->minSampleShading->setText(lit("0.0"));
@@ -2470,9 +2472,10 @@ void VulkanPipelineStateViewer::setState()
ui->rasterizerDiscard->setPixmap(state.rasterizer.rasterizerDiscardEnable ? tick : cross);
ui->lineWidth->setText(Formatter::Format(state.rasterizer.lineWidth));
ui->conservativeRaster->setText(ToQStr(state.rasterizer.conservativeRasterization));
ui->overestimationSize->setText(
Formatter::Format(state.rasterizer.extraPrimitiveOverestimationSize));
QString conservRaster = ToQStr(state.rasterizer.conservativeRasterization);
if(state.rasterizer.conservativeRasterization == ConservativeRaster::Overestimate &&
state.rasterizer.extraPrimitiveOverestimationSize > 0.0f)
conservRaster += QFormatStr(" (+%1)").arg(state.rasterizer.extraPrimitiveOverestimationSize);
if(state.rasterizer.lineStippleFactor == 0)
{
@@ -2489,6 +2492,14 @@ void VulkanPipelineStateViewer::setState()
ui->stipplePattern->setText(QString::number(state.rasterizer.lineStipplePattern, 2));
}
ui->pipelineShadingRate->setText(QFormatStr("%1x%2")
.arg(state.rasterizer.pipelineShadingRate.first)
.arg(state.rasterizer.pipelineShadingRate.second));
ui->shadingRateCombiners->setText(
QFormatStr("%1, %2")
.arg(ToQStr(state.rasterizer.shadingRateCombiners.first, GraphicsAPI::Vulkan))
.arg(ToQStr(state.rasterizer.shadingRateCombiners.second, GraphicsAPI::Vulkan)));
if(state.currentPass.renderpass.multiviews.isEmpty())
{
ui->multiview->setText(tr("Disabled"));
@@ -2590,6 +2601,7 @@ void VulkanPipelineStateViewer::setState()
bool usedSlot =
(colIdx >= 0 || resIdx >= 0 || state.currentPass.renderpass.depthstencilAttachment == i ||
state.currentPass.renderpass.fragmentDensityAttachment == i ||
state.currentPass.renderpass.shadingRateAttachment == i ||
state.currentPass.renderpass.depthstencilResolveAttachment == i);
if(showNode(usedSlot, filledSlot))
@@ -2631,6 +2643,7 @@ void VulkanPipelineStateViewer::setState()
.arg(ToQStr(p.swizzle.alpha));
}
rdcpair<uint32_t, uint32_t> shadingRateTexelSize = {0, 0};
QString slotname;
if(colIdx >= 0)
@@ -2649,6 +2662,11 @@ void VulkanPipelineStateViewer::setState()
{
slotname = lit("Fragment Density Map");
}
else if(state.currentPass.renderpass.shadingRateAttachment == i)
{
slotname = lit("Fragment Shading Rate Map");
shadingRateTexelSize = state.currentPass.renderpass.shadingRateTexelSize;
}
else
{
slotname = lit("Depth");
@@ -2681,8 +2699,14 @@ void VulkanPipelineStateViewer::setState()
}
}
RDTreeWidgetItem *node = new RDTreeWidgetItem(
{slotname, p.imageResourceId, typeName, w, h, d, a, format, QString()});
QString resName = ToQStr(p.imageResourceId);
if(shadingRateTexelSize.first > 0)
resName +=
tr(" (%1x%2 texels)").arg(shadingRateTexelSize.first).arg(shadingRateTexelSize.second);
RDTreeWidgetItem *node =
new RDTreeWidgetItem({slotname, resName, typeName, w, h, d, a, format, QString()});
if(tex)
node->setTag(
@@ -4062,6 +4086,16 @@ void VulkanPipelineStateViewer::exportHTML(QXmlStreamWriter &xml, const VKPipe::
tr("Fragment Density Attachment: %1").arg(pass.renderpass.fragmentDensityAttachment));
xml.writeEndElement();
}
if(pass.renderpass.shadingRateAttachment >= 0)
{
xml.writeStartElement(lit("p"));
xml.writeCharacters(tr("Fragment Shading Rate Attachment: %1 (texel size %2x%3)")
.arg(pass.renderpass.shadingRateAttachment)
.arg(pass.renderpass.shadingRateTexelSize.first)
.arg(pass.renderpass.shadingRateTexelSize.second));
xml.writeEndElement();
}
}
{
@@ -2042,9 +2042,9 @@
</widget>
</item>
<item row="1" column="6">
<widget class="QLabel" name="label_2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Overestimate Size:</string>
<string>Multiview:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@@ -2055,14 +2055,14 @@
</widget>
</item>
<item row="1" column="7">
<widget class="QLabel" name="overestimationSize">
<widget class="QLabel" name="multiview">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>0.00</string>
<string>TextLabel</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@@ -2175,9 +2175,9 @@
</widget>
</item>
<item row="2" column="6">
<widget class="QLabel" name="label_3">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Multiview:</string>
<string>Pipeline shading rate:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
@@ -2188,14 +2188,14 @@
</widget>
</item>
<item row="2" column="7">
<widget class="QLabel" name="multiview">
<widget class="QLabel" name="pipelineShadingRate">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>TextLabel</string>
<string>1x1</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@@ -2256,8 +2256,8 @@
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>0000000000000000</string>
<property name="pixmap">
<pixmap resource="../../Resources/resources.qrc">:/cross.png</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
@@ -2296,6 +2296,37 @@
</property>
</widget>
</item>
<item row="3" column="6">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Shading rate combiners:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="7">
<widget class="QLabel" name="shadingRateCombiners">
<property name="font">
<font>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
<string>Keep, Keep</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="margin">
<number>4</number>
</property>
</widget>
</item>
<item row="4" column="0">
<spacer name="rastVSpacer">
<property name="orientation">
+50
View File
@@ -824,6 +824,29 @@ See :data:`conservativeRasterizationMode`
uint32_t lineStippleFactor = 0;
DOCUMENT("The line stipple bit-pattern.");
uint16_t lineStipplePattern = 0;
DOCUMENT(R"(The current pipeline fragment shading rate. This will always be 1x1 when a fragment
shading rate has not been specified.
:type: Tuple[int,int]
)");
rdcpair<uint32_t, uint32_t> pipelineShadingRate = {1, 1};
DOCUMENT(R"(The fragment shading rate combiners.
The combiners are applied as follows, according to the Vulkan spec:
``intermediateRate = combiner[0] ( pipelineShadingRate, shaderExportedShadingRate )``
``finalRate = combiner[1] ( intermediateRate, imageBasedShadingRate )``
Where the first input is from :data:`pipelineShadingRate` and the second is the exported shading
rate from the last pre-rasterization shader stage, which defaults to 1x1 if not exported.
The intermediate result is then used as the first input to the second combiner, together with the
shading rate sampled from the fragment shading rate attachment.
:type: Tuple[ShadingRateCombiner,ShadingRateCombiner]
)");
rdcpair<ShadingRateCombiner, ShadingRateCombiner> shadingRateCombiners = {
ShadingRateCombiner::Keep, ShadingRateCombiner::Keep};
};
DOCUMENT("Describes state of custom sample locations in the pipeline.");
@@ -988,9 +1011,36 @@ If there is no depth-stencil resolve attachment, this index is ``-1``.
DOCUMENT(R"(An index into the framebuffer attachments for the fragment density attachment.
If there is no fragment density attachment, this index is ``-1``.
.. note::
Only one at most of :data:`fragmentDensityAttachment` and :data:`shadingRateAttachment` will be
set.
)");
int32_t fragmentDensityAttachment = -1;
DOCUMENT(R"(An index into the framebuffer attachments for the fragment shading rate attachment.
If there is no fragment shading rate attachment, this index is ``-1``.
.. note::
Only one at most of :data:`fragmentDensityAttachment` and :data:`shadingRateAttachment` will be
set.
)");
int32_t shadingRateAttachment = -1;
DOCUMENT(R"(The size of the framebuffer region represented by each texel in
:data:`shadingRateAttachment`.
For example if this is (2,2) then every texel in the attachment gives the shading rate of a 2x2
block in the framebuffer so the shading rate attachment is half the size of the other attachments in
each dimension.
If no attachment is set in :data:`shadingRateAttachment` this will be (1,1).
:type: Tuple[int,int]
)");
rdcpair<uint32_t, uint32_t> shadingRateTexelSize = {1, 1};
DOCUMENT(R"(If multiview is enabled, contains a list of view indices to be broadcast to during
rendering.
+2 -1
View File
@@ -133,6 +133,7 @@ Maintainers can update this file by updating vk.xml in this folder and running `
* `VK_KHR_external_semaphore_win32`
* `VK_KHR_external_semaphore`
* `VK_KHR_format_feature_flags2`
* `VK_KHR_fragment_shading_rate`
* `VK_KHR_get_display_properties2`
* `VK_KHR_get_memory_requirements2`
* `VK_KHR_get_physical_device_properties2`
@@ -204,7 +205,7 @@ KHR extensions will definitely be implemented at some point, though KHR extensio
## KHR Extensions
* `VK_KHR_fragment_shading_rate`
* None currently.
## KHR Portability
+14
View File
@@ -727,6 +727,7 @@ enum class VulkanChunk : uint32_t
vkCmdSetVertexInputEXT,
vkCmdBeginRendering,
vkCmdEndRendering,
vkCmdSetFragmentShadingRateKHR,
Max,
};
@@ -880,6 +881,7 @@ DECLARE_REFLECTION_STRUCT(VkFenceGetFdInfoKHR);
DECLARE_REFLECTION_STRUCT(VkFilterCubicImageViewImageFormatPropertiesEXT);
DECLARE_REFLECTION_STRUCT(VkFormatProperties2);
DECLARE_REFLECTION_STRUCT(VkFormatProperties3KHR);
DECLARE_REFLECTION_STRUCT(VkFragmentShadingRateAttachmentInfoKHR);
DECLARE_REFLECTION_STRUCT(VkFramebufferAttachmentImageInfo);
DECLARE_REFLECTION_STRUCT(VkFramebufferAttachmentsCreateInfo);
DECLARE_REFLECTION_STRUCT(VkFramebufferCreateInfo);
@@ -961,6 +963,9 @@ DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceGroupProperties);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceHostQueryResetFeatures);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFragmentShadingRateKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFragmentShadingRateFeaturesKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceFragmentShadingRatePropertiesKHR);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceIDProperties);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImageFormatInfo2);
DECLARE_REFLECTION_STRUCT(VkPhysicalDeviceImagelessFramebufferFeatures);
@@ -1056,6 +1061,7 @@ DECLARE_REFLECTION_STRUCT(VkPipelineExecutableInfoKHR);
DECLARE_REFLECTION_STRUCT(VkPipelineExecutableInternalRepresentationKHR);
DECLARE_REFLECTION_STRUCT(VkPipelineExecutablePropertiesKHR);
DECLARE_REFLECTION_STRUCT(VkPipelineExecutableStatisticKHR);
DECLARE_REFLECTION_STRUCT(VkPipelineFragmentShadingRateStateCreateInfoKHR);
DECLARE_REFLECTION_STRUCT(VkPipelineInfoKHR);
DECLARE_REFLECTION_STRUCT(VkPipelineInputAssemblyStateCreateInfo);
DECLARE_REFLECTION_STRUCT(VkPipelineLayoutCreateInfo);
@@ -1088,6 +1094,7 @@ DECLARE_REFLECTION_STRUCT(VkQueueFamilyProperties2);
DECLARE_REFLECTION_STRUCT(VkRefreshCycleDurationGOOGLE);
DECLARE_REFLECTION_STRUCT(VkRenderingAttachmentInfo);
DECLARE_REFLECTION_STRUCT(VkRenderingFragmentDensityMapAttachmentInfoEXT);
DECLARE_REFLECTION_STRUCT(VkRenderingFragmentShadingRateAttachmentInfoKHR);
DECLARE_REFLECTION_STRUCT(VkRenderingInfo);
DECLARE_REFLECTION_STRUCT(VkRenderPassAttachmentBeginInfo);
DECLARE_REFLECTION_STRUCT(VkRenderPassBeginInfo);
@@ -1245,6 +1252,7 @@ DECLARE_DESERIALISE_TYPE(VkFenceGetFdInfoKHR);
DECLARE_DESERIALISE_TYPE(VkFilterCubicImageViewImageFormatPropertiesEXT);
DECLARE_DESERIALISE_TYPE(VkFormatProperties2);
DECLARE_DESERIALISE_TYPE(VkFormatProperties3KHR);
DECLARE_DESERIALISE_TYPE(VkFragmentShadingRateAttachmentInfoKHR);
DECLARE_DESERIALISE_TYPE(VkFramebufferAttachmentImageInfo);
DECLARE_DESERIALISE_TYPE(VkFramebufferAttachmentsCreateInfo);
DECLARE_DESERIALISE_TYPE(VkFramebufferCreateInfo);
@@ -1322,6 +1330,9 @@ DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceGroupProperties);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceHostQueryResetFeatures);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFragmentShadingRateKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFragmentShadingRateFeaturesKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceFragmentShadingRatePropertiesKHR);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceIDProperties);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImageFormatInfo2);
DECLARE_DESERIALISE_TYPE(VkPhysicalDeviceImagelessFramebufferFeatures);
@@ -1417,6 +1428,7 @@ DECLARE_DESERIALISE_TYPE(VkPipelineExecutableInfoKHR);
DECLARE_DESERIALISE_TYPE(VkPipelineExecutableInternalRepresentationKHR);
DECLARE_DESERIALISE_TYPE(VkPipelineExecutablePropertiesKHR);
DECLARE_DESERIALISE_TYPE(VkPipelineExecutableStatisticKHR);
DECLARE_DESERIALISE_TYPE(VkPipelineFragmentShadingRateStateCreateInfoKHR);
DECLARE_DESERIALISE_TYPE(VkPipelineInfoKHR);
DECLARE_DESERIALISE_TYPE(VkPipelineInputAssemblyStateCreateInfo);
DECLARE_DESERIALISE_TYPE(VkPipelineLayoutCreateInfo);
@@ -1446,6 +1458,7 @@ DECLARE_DESERIALISE_TYPE(VkQueryPoolPerformanceCreateInfoKHR);
DECLARE_DESERIALISE_TYPE(VkQueueFamilyGlobalPriorityPropertiesKHR);
DECLARE_DESERIALISE_TYPE(VkQueueFamilyProperties2);
DECLARE_DESERIALISE_TYPE(VkRenderingAttachmentInfo);
DECLARE_DESERIALISE_TYPE(VkRenderingFragmentDensityMapAttachmentInfoEXT);
DECLARE_DESERIALISE_TYPE(VkRenderingFragmentShadingRateAttachmentInfoKHR);
DECLARE_DESERIALISE_TYPE(VkRenderingInfo);
DECLARE_DESERIALISE_TYPE(VkRenderPassAttachmentBeginInfo);
@@ -1729,6 +1742,7 @@ DECLARE_REFLECTION_ENUM(VkFlagWithNoBits);
DECLARE_REFLECTION_ENUM(VkFormat);
DECLARE_REFLECTION_ENUM(VkFormatFeatureFlagBits);
DECLARE_REFLECTION_ENUM(VkFormatFeatureFlagBits2);
DECLARE_REFLECTION_ENUM(VkFragmentShadingRateCombinerOpKHR);
DECLARE_REFLECTION_ENUM(VkFramebufferCreateFlagBits);
DECLARE_REFLECTION_ENUM(VkFrontFace);
DECLARE_REFLECTION_ENUM(VkImageAspectFlagBits);
+7 -2
View File
@@ -1226,6 +1226,9 @@ static const VkExtensionProperties supportedExtensions[] = {
{
VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME, VK_KHR_FORMAT_FEATURE_FLAGS_2_SPEC_VERSION,
},
{
VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME, VK_KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION,
},
{
VK_KHR_GET_DISPLAY_PROPERTIES_2_EXTENSION_NAME, VK_KHR_GET_DISPLAY_PROPERTIES_2_SPEC_VERSION,
},
@@ -3519,8 +3522,10 @@ bool WrappedVulkan::ProcessChunk(ReadSerialiser &ser, VulkanChunk chunk)
case VulkanChunk::vkCmdBeginRendering:
return Serialise_vkCmdBeginRendering(ser, VK_NULL_HANDLE, NULL);
case VulkanChunk::vkCmdEndRendering:
return Serialise_vkCmdEndRendering(ser, VK_NULL_HANDLE);
case VulkanChunk::vkCmdEndRendering: return Serialise_vkCmdEndRendering(ser, VK_NULL_HANDLE);
case VulkanChunk::vkCmdSetFragmentShadingRateKHR:
return Serialise_vkCmdSetFragmentShadingRateKHR(ser, VK_NULL_HANDLE, NULL, NULL);
// chunks that are reserved but not yet serialised
case VulkanChunk::vkResetCommandPool:
+11
View File
@@ -409,6 +409,7 @@ private:
bool m_NULLDescriptorsAllowed = false;
bool m_ExtendedDynState = false;
bool m_ExtendedDynState2 = false;
bool m_FragmentShadingRate = false;
bool m_DynColorWrite = false;
bool m_DynVertexInput = false;
@@ -1132,6 +1133,7 @@ public:
bool NULLDescriptorsAllowed() const { return m_NULLDescriptorsAllowed; }
bool ExtendedDynamicState() const { return m_ExtendedDynState; }
bool ExtendedDynamicState2() const { return m_ExtendedDynState2; }
bool FragmentShadingRate() const { return m_FragmentShadingRate; }
bool DynamicColorWrite() const { return m_DynColorWrite; }
bool DynamicVertexInput() const { return m_DynVertexInput; }
VulkanRenderState &GetRenderState() { return m_RenderState; }
@@ -2517,4 +2519,13 @@ public:
const VkRenderingInfo *pRenderingInfo);
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdEndRendering, VkCommandBuffer commandBuffer);
// VK_KHR_fragment_shading_rate
IMPLEMENT_FUNCTION_SERIALISED(void, vkCmdSetFragmentShadingRateKHR, VkCommandBuffer commandBuffer,
const VkExtent2D *pFragmentSize,
const VkFragmentShadingRateCombinerOpKHR combinerOps[2]);
VkResult vkGetPhysicalDeviceFragmentShadingRatesKHR(
VkPhysicalDevice physicalDevice, uint32_t *pFragmentShadingRateCount,
VkPhysicalDeviceFragmentShadingRateKHR *pFragmentShadingRates);
};
+15 -3
View File
@@ -536,7 +536,8 @@
DeclExt(EXT_color_write_enable); \
DeclExt(EXT_extended_dynamic_state2); \
DeclExt(EXT_vertex_input_dynamic_state); \
DeclExt(KHR_dynamic_rendering);
DeclExt(KHR_dynamic_rendering); \
DeclExt(KHR_fragment_shading_rate);
// for simplicity and since the check itself is platform agnostic,
// these aren't protected in platform defines
@@ -569,7 +570,8 @@
CheckExt(EXT_headless_surface, VKXX); \
CheckExt(EXT_metal_surface, VKXX); \
CheckExt(KHR_wayland_surface, VKXX); \
CheckExt(KHR_performance_query, VKXX);
CheckExt(KHR_performance_query, VKXX); \
CheckExt(KHR_fragment_shading_rate, VKXX);
#define CheckDeviceExts() \
CheckExt(EXT_debug_marker, VKXX); \
@@ -642,7 +644,8 @@
CheckExt(EXT_color_write_enable, VKXX); \
CheckExt(EXT_extended_dynamic_state2, VK13); \
CheckExt(EXT_vertex_input_dynamic_state, VKXX); \
CheckExt(KHR_dynamic_rendering, VK13);
CheckExt(KHR_dynamic_rendering, VK13); \
CheckExt(KHR_fragment_shading_rate, VKXX);
#define HookInitVulkanInstanceExts_PhysDev() \
HookInitExtension(KHR_surface, GetPhysicalDeviceSurfaceSupportKHR); \
@@ -688,6 +691,7 @@
EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR); \
HookInitExtension(KHR_performance_query, GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR); \
HookInitPromotedExtension(EXT_tooling_info, GetPhysicalDeviceToolProperties, EXT); \
HookInitExtension(KHR_fragment_shading_rate, GetPhysicalDeviceFragmentShadingRatesKHR); \
HookInitExtension_PhysDev_Win32(); \
HookInitExtension_PhysDev_Linux(); \
HookInitExtension_PhysDev_GGP(); \
@@ -753,6 +757,7 @@
EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR); \
HookInitExtension(KHR_performance_query, GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR); \
HookInitPromotedExtension(EXT_tooling_info, GetPhysicalDeviceToolProperties, EXT); \
HookInitExtension(KHR_fragment_shading_rate, GetPhysicalDeviceFragmentShadingRatesKHR); \
HookInitExtension_Instance_Win32(); \
HookInitExtension_Instance_Linux(); \
HookInitExtension_Instance_GGP(); \
@@ -897,6 +902,7 @@
HookInitExtension(EXT_vertex_input_dynamic_state, CmdSetVertexInputEXT); \
HookInitPromotedExtension(KHR_dynamic_rendering, CmdBeginRendering, KHR); \
HookInitPromotedExtension(KHR_dynamic_rendering, CmdEndRendering, KHR); \
HookInitExtension(KHR_fragment_shading_rate, CmdSetFragmentShadingRateKHR); \
HookInitExtension_Device_Win32(); \
HookInitExtension_Device_Linux(); \
HookInitExtension_Device_GGP(); \
@@ -1609,6 +1615,12 @@
HookDefine2(void, vkCmdBeginRendering, VkCommandBuffer, commandBuffer, const VkRenderingInfo *, \
pRenderingInfo); \
HookDefine1(void, vkCmdEndRendering, VkCommandBuffer, commandBuffer); \
HookDefine3(void, vkCmdSetFragmentShadingRateKHR, VkCommandBuffer, commandBuffer, \
const VkExtent2D *, pFragmentSize, const VkFragmentShadingRateCombinerOpKHR *, \
combinerOps); \
HookDefine3(VkResult, vkGetPhysicalDeviceFragmentShadingRatesKHR, VkPhysicalDevice, \
physicalDevice, uint32_t *, pFragmentShadingRateCount, \
VkPhysicalDeviceFragmentShadingRateKHR *, pFragmentShadingRates); \
HookDefine_Win32(); \
HookDefine_Linux(); \
HookDefine_GGP(); \
+33
View File
@@ -515,6 +515,19 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan,
scissors[i] = pCreateInfo->pViewportState->pScissors[i];
}
// VkPipelineFragmentShadingRateStateCreateInfoKHR
shadingRate = {1, 1};
shadingRateCombiners[0] = shadingRateCombiners[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
const VkPipelineFragmentShadingRateStateCreateInfoKHR *shadingRateInfo =
(const VkPipelineFragmentShadingRateStateCreateInfoKHR *)FindNextStruct(
pCreateInfo, VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR);
if(shadingRateInfo)
{
shadingRate = shadingRateInfo->fragmentSize;
shadingRateCombiners[0] = shadingRateInfo->combinerOps[0];
shadingRateCombiners[1] = shadingRateInfo->combinerOps[1];
}
// VkPipelineDiscardRectangleStateCreateInfoEXT
discardMode = VK_DISCARD_RECTANGLE_MODE_EXCLUSIVE_EXT;
@@ -1048,6 +1061,7 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan,
? depthstencilResolve->pDepthStencilResolveAttachment->attachment
: -1);
// VK_EXT_fragment_density_map
dst.fragmentDensityAttachment =
(fragmentDensity &&
fragmentDensity->fragmentDensityMapAttachment.attachment != VK_ATTACHMENT_UNUSED
@@ -1060,6 +1074,25 @@ void VulkanCreationInfo::RenderPass::Init(VulkanResourceManager *resourceMan,
? fragmentDensity->fragmentDensityMapAttachment.layout
: VK_IMAGE_LAYOUT_UNDEFINED);
// VK_KHR_fragment_shading_rate
const VkFragmentShadingRateAttachmentInfoKHR *shadingRate =
(const VkFragmentShadingRateAttachmentInfoKHR *)FindNextStruct(
&src, VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR);
dst.shadingRateAttachment =
(shadingRate && shadingRate->pFragmentShadingRateAttachment &&
shadingRate->pFragmentShadingRateAttachment->attachment != VK_ATTACHMENT_UNUSED
? shadingRate->pFragmentShadingRateAttachment->attachment
: -1);
dst.shadingRateLayout =
(shadingRate && shadingRate->pFragmentShadingRateAttachment &&
shadingRate->pFragmentShadingRateAttachment->attachment != VK_ATTACHMENT_UNUSED
? shadingRate->pFragmentShadingRateAttachment->layout
: VK_IMAGE_LAYOUT_UNDEFINED);
dst.shadingRateTexelSize =
shadingRate ? shadingRate->shadingRateAttachmentTexelSize : VkExtent2D({1, 1});
for(uint32_t i = 0; i < 32; i++)
{
if(src.viewMask & (1 << i))
+8
View File
@@ -403,6 +403,10 @@ struct VulkanCreationInfo
// VkPipelineDiscardRectangleStateCreateInfoEXT
rdcarray<VkRect2D> discardRectangles;
VkDiscardRectangleModeEXT discardMode;
// VkPipelineFragmentShadingRateCreateInfoKHR
VkExtent2D shadingRate;
VkFragmentShadingRateCombinerOpKHR shadingRateCombiners[2];
};
std::unordered_map<ResourceId, Pipeline> m_Pipeline;
@@ -451,6 +455,7 @@ struct VulkanCreationInfo
int32_t depthstencilAttachment;
int32_t depthstencilResolveAttachment;
int32_t fragmentDensityAttachment;
int32_t shadingRateAttachment;
rdcarray<VkImageLayout> inputLayouts;
rdcarray<VkImageLayout> inputStencilLayouts;
@@ -458,6 +463,9 @@ struct VulkanCreationInfo
VkImageLayout depthLayout;
VkImageLayout stencilLayout;
VkImageLayout fragmentDensityLayout;
VkImageLayout shadingRateLayout;
VkExtent2D shadingRateTexelSize;
rdcarray<uint32_t> multiviews;
};
+12 -6
View File
@@ -164,6 +164,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
COPY_STRUCT(VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, VkFenceCreateInfo); \
COPY_STRUCT(VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT, \
VkFilterCubicImageViewImageFormatPropertiesEXT); \
COPY_STRUCT(VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR, \
VkFragmentShadingRateAttachmentInfoKHR); \
COPY_STRUCT(VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, VkFormatProperties2); \
COPY_STRUCT(VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3, VkFormatProperties3); \
COPY_STRUCT(VK_STRUCTURE_TYPE_HDR_METADATA_EXT, VkHdrMetadataEXT) \
@@ -265,6 +267,12 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
VkPhysicalDeviceFragmentDensityMap2PropertiesEXT); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, \
VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, \
VkPhysicalDeviceFragmentShadingRateFeaturesKHR); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR, \
VkPhysicalDeviceFragmentShadingRateKHR); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR, \
VkPhysicalDeviceFragmentShadingRatePropertiesKHR); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, \
VkPhysicalDeviceHostQueryResetFeatures); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VkPhysicalDeviceIDProperties); \
@@ -448,6 +456,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR, VkPipelineExecutableStatisticKHR) \
COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR, \
VkPipelineExecutableInternalRepresentationKHR) \
COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR, \
VkPipelineFragmentShadingRateStateCreateInfoKHR) \
COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, \
VkPipelineInputAssemblyStateCreateInfo); \
COPY_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, \
@@ -595,6 +605,8 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
UnwrapInPlace(out->srcSet), UnwrapInPlace(out->dstSet)); \
UNWRAP_STRUCT(VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT, \
VkRenderingFragmentDensityMapAttachmentInfoEXT, UnwrapInPlace(out->imageView)); \
UNWRAP_STRUCT(VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR, \
VkRenderingFragmentShadingRateAttachmentInfoKHR, UnwrapInPlace(out->imageView)); \
UNWRAP_STRUCT(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV, \
VkDedicatedAllocationMemoryAllocateInfoNV, UnwrapInPlace(out->buffer), \
UnwrapInPlace(out->image)); \
@@ -715,7 +727,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
case VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT: \
case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: \
case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: \
case VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: \
case VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV: \
case VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV: \
case VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV: \
@@ -772,9 +783,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT: \
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV: \
@@ -811,7 +819,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: \
case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: \
case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV: \
case VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR: \
case VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR: \
case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT: \
case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: \
@@ -830,7 +837,6 @@ static void AppendModifiedChainedStruct(byte *&tempMem, VkStruct *outputStruct,
case VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR: \
case VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR: \
case VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV: \
case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: \
case VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM: \
case VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT: \
case VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX: \
+63
View File
@@ -1375,6 +1375,34 @@ void VulkanReplay::SavePipelineState(uint32_t eventId)
default: break;
}
ret.rasterizer.pipelineShadingRate = {state.pipelineShadingRate.width,
state.pipelineShadingRate.height};
ShadingRateCombiner combiners[2] = {};
for(int i = 0; i < 2; i++)
{
switch(state.shadingRateCombiners[i])
{
default:
case VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR:
combiners[i] = ShadingRateCombiner::Keep;
break;
case VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR:
combiners[i] = ShadingRateCombiner::Replace;
break;
case VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_KHR:
combiners[i] = ShadingRateCombiner::Min;
break;
case VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_KHR:
combiners[i] = ShadingRateCombiner::Max;
break;
case VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR:
combiners[i] = ShadingRateCombiner::Multiply;
break;
}
}
ret.rasterizer.shadingRateCombiners = {combiners[0], combiners[1]};
ret.rasterizer.lineRasterMode = LineRaster::Default;
// "VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT is equivalent to
@@ -1666,6 +1694,34 @@ void VulkanReplay::SavePipelineState(uint32_t eventId)
rpState.fragmentDensityAttachment = -1;
}
if(dyn.shadingRateView != VK_NULL_HANDLE)
{
fbState.attachments.push_back({});
ResourceId viewid = GetResID(dyn.shadingRateView);
fbState.attachments.back().viewResourceId = rm->GetOriginalID(viewid);
ret.currentPass.framebuffer.attachments[attIdx].imageResourceId =
rm->GetOriginalID(c.m_ImageView[viewid].image);
fbState.attachments.back().viewFormat = MakeResourceFormat(c.m_ImageView[viewid].format);
fbState.attachments.back().firstMip = c.m_ImageView[viewid].range.baseMipLevel;
fbState.attachments.back().firstSlice = c.m_ImageView[viewid].range.baseArrayLayer;
fbState.attachments.back().numMips = c.m_ImageView[viewid].range.levelCount;
fbState.attachments.back().numSlices = c.m_ImageView[viewid].range.layerCount;
Convert(fbState.attachments.back().swizzle, c.m_ImageView[viewid].componentMapping);
rpState.shadingRateAttachment = int32_t(attIdx++);
rpState.shadingRateTexelSize = {dyn.shadingRateTexelSize.width,
dyn.shadingRateTexelSize.height};
}
else
{
rpState.shadingRateAttachment = -1;
rpState.shadingRateTexelSize = {1, 1};
}
rpState.multiviews.clear();
for(uint32_t v = 0; v < 32; v++)
{
@@ -1692,6 +1748,11 @@ void VulkanReplay::SavePipelineState(uint32_t eventId)
c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].depthstencilResolveAttachment;
ret.currentPass.renderpass.fragmentDensityAttachment =
c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].fragmentDensityAttachment;
ret.currentPass.renderpass.shadingRateAttachment =
c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].shadingRateAttachment;
VkExtent2D texelSize =
c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].shadingRateTexelSize;
ret.currentPass.renderpass.shadingRateTexelSize = {texelSize.width, texelSize.height};
ret.currentPass.renderpass.multiviews =
c.m_RenderPass[state.GetRenderPass()].subpasses[state.subpass].multiviews;
@@ -1764,6 +1825,8 @@ void VulkanReplay::SavePipelineState(uint32_t eventId)
ret.currentPass.renderpass.depthstencilAttachment = -1;
ret.currentPass.renderpass.depthstencilResolveAttachment = -1;
ret.currentPass.renderpass.fragmentDensityAttachment = -1;
ret.currentPass.renderpass.shadingRateAttachment = -1;
ret.currentPass.renderpass.shadingRateTexelSize = {1, 1};
ret.currentPass.framebuffer.resourceId = ResourceId();
ret.currentPass.framebuffer.attachments.clear();
+140 -9
View File
@@ -954,6 +954,8 @@ SERIALISE_VK_HANDLES();
VkCommandBufferInheritanceRenderingInfo) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT, \
VkRenderingFragmentDensityMapAttachmentInfoEXT) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR, \
VkRenderingFragmentShadingRateAttachmentInfoKHR) \
\
/* VK_KHR_external_fence_capabilities */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO, \
@@ -1055,6 +1057,18 @@ SERIALISE_VK_HANDLES();
/* VK_KHR_incremental_present */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR, VkPresentRegionsKHR) \
\
/* VK_KHR_fragment_shading_rate */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR, \
VkFragmentShadingRateAttachmentInfoKHR) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR, \
VkPipelineFragmentShadingRateStateCreateInfoKHR) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR, \
VkPhysicalDeviceFragmentShadingRatePropertiesKHR) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR, \
VkPhysicalDeviceFragmentShadingRateFeaturesKHR) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR, \
VkPhysicalDeviceFragmentShadingRateKHR) \
\
/* VK_KHR_maintenance2 */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, \
VkPhysicalDevicePointClippingProperties) \
@@ -1380,15 +1394,6 @@ SERIALISE_VK_HANDLES();
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR) \
\
/* VK_KHR_fragment_shading_rate */ \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR) \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR) \
/* Interaction with VK_KHR_dynamic_rendering */ \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR) \
\
/* VK_KHR_pipeline_library */ \
PNEXT_UNSUPPORTED(VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR) \
\
@@ -4939,6 +4944,108 @@ void DoSerialise(SerialiserType &ser, VkInputAttachmentAspectReference &el)
SERIALISE_MEMBER_VKFLAGS(VkImageAspectFlags, aspectMask);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkFragmentShadingRateAttachmentInfoKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER_OPT(pFragmentShadingRateAttachment).Important();
SERIALISE_MEMBER(shadingRateAttachmentTexelSize);
}
template <>
void Deserialise(const VkFragmentShadingRateAttachmentInfoKHR &el)
{
DeserialiseNext(el.pNext);
delete el.pFragmentShadingRateAttachment;
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPipelineFragmentShadingRateStateCreateInfoKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(fragmentSize);
SERIALISE_MEMBER(combinerOps);
}
template <>
void Deserialise(const VkPipelineFragmentShadingRateStateCreateInfoKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPhysicalDeviceFragmentShadingRatePropertiesKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(minFragmentShadingRateAttachmentTexelSize);
SERIALISE_MEMBER(maxFragmentShadingRateAttachmentTexelSize);
SERIALISE_MEMBER(maxFragmentShadingRateAttachmentTexelSizeAspectRatio);
SERIALISE_MEMBER(primitiveFragmentShadingRateWithMultipleViewports);
SERIALISE_MEMBER(layeredShadingRateAttachments);
SERIALISE_MEMBER(fragmentShadingRateNonTrivialCombinerOps);
SERIALISE_MEMBER(maxFragmentSize);
SERIALISE_MEMBER(maxFragmentSizeAspectRatio);
SERIALISE_MEMBER(maxFragmentShadingRateCoverageSamples);
SERIALISE_MEMBER(maxFragmentShadingRateRasterizationSamples);
SERIALISE_MEMBER(fragmentShadingRateWithShaderDepthStencilWrites);
SERIALISE_MEMBER(fragmentShadingRateWithSampleMask);
SERIALISE_MEMBER(fragmentShadingRateWithShaderSampleMask);
SERIALISE_MEMBER(fragmentShadingRateWithConservativeRasterization);
SERIALISE_MEMBER(fragmentShadingRateWithFragmentShaderInterlock);
SERIALISE_MEMBER(fragmentShadingRateWithCustomSampleLocations);
SERIALISE_MEMBER(fragmentShadingRateStrictMultiplyCombiner);
}
template <>
void Deserialise(const VkPhysicalDeviceFragmentShadingRatePropertiesKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPhysicalDeviceFragmentShadingRateFeaturesKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(pipelineFragmentShadingRate);
SERIALISE_MEMBER(primitiveFragmentShadingRate);
SERIALISE_MEMBER(attachmentFragmentShadingRate);
}
template <>
void Deserialise(const VkPhysicalDeviceFragmentShadingRateFeaturesKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPhysicalDeviceFragmentShadingRateKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER_VKFLAGS(VkSampleCountFlags, sampleCounts);
SERIALISE_MEMBER(fragmentSize);
}
template <>
void Deserialise(const VkPhysicalDeviceFragmentShadingRateKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPhysicalDevicePointClippingProperties &el)
{
@@ -7606,6 +7713,24 @@ void Deserialise(const VkRenderingFragmentDensityMapAttachmentInfoEXT &el)
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkRenderingFragmentShadingRateAttachmentInfoKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(imageView);
SERIALISE_MEMBER(imageLayout);
SERIALISE_MEMBER(shadingRateAttachmentTexelSize);
}
template <>
void Deserialise(const VkRenderingFragmentShadingRateAttachmentInfoKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkCommandBufferInheritanceRenderingInfo &el)
{
@@ -10076,6 +10201,7 @@ INSTANTIATE_SERIALISE_TYPE(VkFenceGetFdInfoKHR);
INSTANTIATE_SERIALISE_TYPE(VkFilterCubicImageViewImageFormatPropertiesEXT);
INSTANTIATE_SERIALISE_TYPE(VkFormatProperties2);
INSTANTIATE_SERIALISE_TYPE(VkFormatProperties3KHR);
INSTANTIATE_SERIALISE_TYPE(VkFragmentShadingRateAttachmentInfoKHR);
INSTANTIATE_SERIALISE_TYPE(VkFramebufferAttachmentImageInfo);
INSTANTIATE_SERIALISE_TYPE(VkFramebufferAttachmentsCreateInfo);
INSTANTIATE_SERIALISE_TYPE(VkFramebufferCreateInfo);
@@ -10157,6 +10283,9 @@ INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceGroupProperties);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceHostQueryResetFeatures);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFragmentShadingRateKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFragmentShadingRateFeaturesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceFragmentShadingRatePropertiesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceIDProperties);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceImageFormatInfo2);
INSTANTIATE_SERIALISE_TYPE(VkPhysicalDeviceImagelessFramebufferFeatures);
@@ -10250,6 +10379,7 @@ INSTANTIATE_SERIALISE_TYPE(VkPipelineExecutableInfoKHR);
INSTANTIATE_SERIALISE_TYPE(VkPipelineExecutableInternalRepresentationKHR);
INSTANTIATE_SERIALISE_TYPE(VkPipelineExecutablePropertiesKHR);
INSTANTIATE_SERIALISE_TYPE(VkPipelineExecutableStatisticKHR);
INSTANTIATE_SERIALISE_TYPE(VkPipelineFragmentShadingRateStateCreateInfoKHR);
INSTANTIATE_SERIALISE_TYPE(VkPipelineInfoKHR);
INSTANTIATE_SERIALISE_TYPE(VkPipelineInputAssemblyStateCreateInfo);
INSTANTIATE_SERIALISE_TYPE(VkPipelineLayoutCreateInfo);
@@ -10282,6 +10412,7 @@ INSTANTIATE_SERIALISE_TYPE(VkQueueFamilyProperties2);
INSTANTIATE_SERIALISE_TYPE(VkRefreshCycleDurationGOOGLE);
INSTANTIATE_SERIALISE_TYPE(VkRenderingAttachmentInfo);
INSTANTIATE_SERIALISE_TYPE(VkRenderingFragmentDensityMapAttachmentInfoEXT);
INSTANTIATE_SERIALISE_TYPE(VkRenderingFragmentShadingRateAttachmentInfoKHR);
INSTANTIATE_SERIALISE_TYPE(VkRenderingInfo);
INSTANTIATE_SERIALISE_TYPE(VkRenderPassAttachmentBeginInfo);
INSTANTIATE_SERIALISE_TYPE(VkRenderPassBeginInfo);
@@ -909,6 +909,22 @@ void VulkanShaderCache::MakeGraphicsPipelineInfo(VkGraphicsPipelineCreateInfo &p
ret.pNext = &discardRects;
}
static VkPipelineFragmentShadingRateStateCreateInfoKHR shadingRate = {
VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR,
};
if(pipeInfo.shadingRate.width != 1 || pipeInfo.shadingRate.height != 1 ||
pipeInfo.shadingRateCombiners[0] != VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR ||
pipeInfo.shadingRateCombiners[1] != VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR)
{
shadingRate.fragmentSize = pipeInfo.shadingRate;
shadingRate.combinerOps[0] = pipeInfo.shadingRateCombiners[0];
shadingRate.combinerOps[1] = pipeInfo.shadingRateCombiners[1];
shadingRate.pNext = ret.pNext;
ret.pNext = &shadingRate;
}
// never create derivatives
ret.flags &= ~VK_PIPELINE_CREATE_DERIVATIVE_BIT;
+7
View File
@@ -423,6 +423,13 @@ void VulkanRenderState::BindPipeline(WrappedVulkan *vk, VkCommandBuffer cmd,
if(stippleFactor && dynamicStates[VkDynamicLineStippleEXT])
ObjDisp(cmd)->CmdSetLineStippleEXT(Unwrap(cmd), stippleFactor, stipplePattern);
if(vk->FragmentShadingRate())
{
if(dynamicStates[VkDynamicShadingRateKHR])
ObjDisp(cmd)->CmdSetFragmentShadingRateKHR(Unwrap(cmd), &pipelineShadingRate,
shadingRateCombiners);
}
if(graphics.pipeline != ResourceId())
BindDescriptorSets(vk, cmd, graphics, VK_PIPELINE_BIND_POINT_GRAPHICS);
+10
View File
@@ -228,8 +228,18 @@ struct VulkanRenderState
VkImageView fragmentDensityView = VK_NULL_HANDLE;
VkImageLayout fragmentDensityLayout = VK_IMAGE_LAYOUT_UNDEFINED;
VkImageView shadingRateView = VK_NULL_HANDLE;
VkImageLayout shadingRateLayout = VK_IMAGE_LAYOUT_UNDEFINED;
VkExtent2D shadingRateTexelSize = {1, 1};
} dynamicRendering;
// shading rate
VkExtent2D pipelineShadingRate = {1, 1};
VkFragmentShadingRateCombinerOpKHR shadingRateCombiners[2] = {
VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR, VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
};
private:
ResourceId renderPass;
ResourceId framebuffer;
+2 -1
View File
@@ -28,7 +28,7 @@
template <>
rdcstr DoStringise(const VulkanChunk &el)
{
RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1175, "Chunks changed without updating names");
RDCCOMPILE_ASSERT((uint32_t)VulkanChunk::Max == 1176, "Chunks changed without updating names");
BEGIN_ENUM_STRINGISE(VulkanChunk)
{
@@ -207,6 +207,7 @@ rdcstr DoStringise(const VulkanChunk &el)
STRINGISE_ENUM_CLASS(vkCmdSetVertexInputEXT)
STRINGISE_ENUM_CLASS(vkCmdBeginRendering)
STRINGISE_ENUM_CLASS(vkCmdEndRendering)
STRINGISE_ENUM_CLASS(vkCmdSetFragmentShadingRateKHR)
STRINGISE_ENUM_CLASS_NAMED(Max, "Max Chunk");
}
END_ENUM_STRINGISE()
@@ -196,6 +196,15 @@ rdcarray<VkImageMemoryBarrier> WrappedVulkan::GetImplicitRenderPassBarriers(uint
atts.back().attachment = (uint32_t)rpinfo.subpasses[subpass].fragmentDensityAttachment;
atts.back().layout = rpinfo.subpasses[subpass].fragmentDensityLayout;
}
int32_t sr = rpinfo.subpasses[subpass].shadingRateAttachment;
if(sr != -1)
{
atts.push_back({});
atts.back().attachment = (uint32_t)rpinfo.subpasses[subpass].shadingRateAttachment;
atts.back().layout = rpinfo.subpasses[subpass].shadingRateLayout;
}
}
for(size_t i = 0; i < atts.size(); i++)
@@ -303,6 +312,12 @@ rdcarray<VkImageMemoryBarrier> WrappedVulkan::GetImplicitRenderPassBarriers(uint
barrier.oldLayout = rpinfo.subpasses[s - 1].fragmentDensityLayout;
break;
}
if((uint32_t)rpinfo.subpasses[s - 1].shadingRateAttachment == idx)
{
barrier.oldLayout = rpinfo.subpasses[s - 1].shadingRateLayout;
break;
}
}
// if we support separate depth stencil and the format contains stencil, add barriers
@@ -1386,7 +1401,24 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(SerialiserType &ser, VkCommandB
};
if(renderstate.dynamicRendering.fragmentDensityView != VK_NULL_HANDLE)
{
fragmentDensity.pNext = info.pNext;
info.pNext = &fragmentDensity;
}
VkRenderingFragmentShadingRateAttachmentInfoKHR shadingRate = {
VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR,
NULL,
renderstate.dynamicRendering.shadingRateView,
renderstate.dynamicRendering.shadingRateLayout,
renderstate.dynamicRendering.shadingRateTexelSize,
};
if(renderstate.dynamicRendering.shadingRateView != VK_NULL_HANDLE)
{
shadingRate.pNext = info.pNext;
info.pNext = &shadingRate;
}
byte *tempMem = GetTempMemory(GetNextPatchSize(&info));
VkRenderingInfo *unwrappedInfo = UnwrapStructAndChain(m_State, tempMem, &info);
@@ -2943,6 +2975,12 @@ bool WrappedVulkan::Serialise_vkCmdBindPipeline(SerialiserType &ser, VkCommandBu
{
renderstate.discardRectangles = pipeInfo.discardRectangles;
}
if(!pipeInfo.dynamicStates[VkDynamicShadingRateKHR])
{
renderstate.pipelineShadingRate = pipeInfo.shadingRate;
renderstate.shadingRateCombiners[0] = pipeInfo.shadingRateCombiners[0];
renderstate.shadingRateCombiners[1] = pipeInfo.shadingRateCombiners[1];
}
if(!pipeInfo.dynamicStates[VkDynamicLineStippleEXT])
{
renderstate.stippleFactor = pipeInfo.stippleFactor;
@@ -6702,6 +6740,19 @@ bool WrappedVulkan::Serialise_vkCmdBeginRendering(SerialiserType &ser, VkCommand
fragmentDensityAttachment->imageLayout;
}
VkRenderingFragmentShadingRateAttachmentInfoKHR *shadingRateAttachment =
(VkRenderingFragmentShadingRateAttachmentInfoKHR *)FindNextStruct(
&RenderingInfo,
VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR);
if(shadingRateAttachment)
{
renderstate.dynamicRendering.shadingRateView = shadingRateAttachment->imageView;
renderstate.dynamicRendering.shadingRateLayout = shadingRateAttachment->imageLayout;
renderstate.dynamicRendering.shadingRateTexelSize =
shadingRateAttachment->shadingRateAttachmentTexelSize;
}
rdcarray<ResourceId> attachments;
for(size_t i = 0; i < renderstate.dynamicRendering.color.size(); i++)
@@ -6835,6 +6886,19 @@ bool WrappedVulkan::Serialise_vkCmdBeginRendering(SerialiserType &ser, VkCommand
renderstate.dynamicRendering.fragmentDensityLayout = fragmentDensityAttachment->imageLayout;
}
VkRenderingFragmentShadingRateAttachmentInfoKHR *shadingRateAttachment =
(VkRenderingFragmentShadingRateAttachmentInfoKHR *)FindNextStruct(
&RenderingInfo,
VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR);
if(shadingRateAttachment)
{
renderstate.dynamicRendering.shadingRateView = shadingRateAttachment->imageView;
renderstate.dynamicRendering.shadingRateLayout = shadingRateAttachment->imageLayout;
renderstate.dynamicRendering.shadingRateTexelSize =
shadingRateAttachment->shadingRateAttachmentTexelSize;
}
rdcarray<ResourceId> attachments;
for(size_t i = 0; i < renderstate.dynamicRendering.color.size(); i++)
@@ -2877,6 +2877,19 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi
CHECK_PHYS_EXT_FEATURE(textureCompressionASTC_HDR);
}
END_PHYS_EXT_CHECK();
BEGIN_PHYS_EXT_CHECK(VkPhysicalDeviceFragmentShadingRateFeaturesKHR,
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR);
{
CHECK_PHYS_EXT_FEATURE(pipelineFragmentShadingRate);
CHECK_PHYS_EXT_FEATURE(primitiveFragmentShadingRate);
CHECK_PHYS_EXT_FEATURE(attachmentFragmentShadingRate);
m_FragmentShadingRate = (ext->pipelineFragmentShadingRate != VK_FALSE) ||
(ext->primitiveFragmentShadingRate != VK_FALSE) ||
(ext->attachmentFragmentShadingRate != VK_FALSE);
}
END_PHYS_EXT_CHECK();
}
if(availFeatures.depthClamp)
@@ -1878,6 +1878,73 @@ void WrappedVulkan::vkCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffe
}
}
template <typename SerialiserType>
bool WrappedVulkan::Serialise_vkCmdSetFragmentShadingRateKHR(
SerialiserType &ser, VkCommandBuffer commandBuffer, const VkExtent2D *pFragmentSize,
const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
{
SERIALISE_ELEMENT(commandBuffer);
SERIALISE_ELEMENT_OPT(pFragmentSize).Important();
SERIALISE_ELEMENT_ARRAY(combinerOps, 4).Important();
Serialise_DebugMessages(ser);
SERIALISE_CHECK_READ_ERRORS();
if(IsReplayingAndReading())
{
m_LastCmdBufferID = GetResourceManager()->GetOriginalID(GetResID(commandBuffer));
if(IsActiveReplaying(m_State))
{
if(InRerecordRange(m_LastCmdBufferID))
{
commandBuffer = RerecordCmdBuf(m_LastCmdBufferID);
{
VulkanRenderState &renderstate = GetCmdRenderState();
renderstate.pipelineShadingRate = *pFragmentSize;
renderstate.shadingRateCombiners[0] = combinerOps[0];
renderstate.shadingRateCombiners[1] = combinerOps[1];
}
}
else
{
commandBuffer = VK_NULL_HANDLE;
}
}
if(commandBuffer != VK_NULL_HANDLE)
ObjDisp(commandBuffer)
->CmdSetFragmentShadingRateKHR(Unwrap(commandBuffer), pFragmentSize, combinerOps);
}
return true;
}
void WrappedVulkan::vkCmdSetFragmentShadingRateKHR(
VkCommandBuffer commandBuffer, const VkExtent2D *pFragmentSize,
const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
{
SCOPED_DBG_SINK();
SERIALISE_TIME_CALL(
ObjDisp(commandBuffer)
->CmdSetFragmentShadingRateKHR(Unwrap(commandBuffer), pFragmentSize, combinerOps));
if(IsCaptureMode(m_State))
{
VkResourceRecord *record = GetRecord(commandBuffer);
CACHE_THREAD_SERIALISER();
SCOPED_SERIALISE_CHUNK(VulkanChunk::vkCmdSetFragmentShadingRateKHR);
Serialise_vkCmdSetFragmentShadingRateKHR(ser, commandBuffer, pFragmentSize, combinerOps);
record->AddChunk(scope.Get(&record->cmdInfo->alloc));
}
}
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetViewport, VkCommandBuffer commandBuffer,
uint32_t firstViewport, uint32_t viewportCount,
const VkViewport *pViewports);
@@ -1965,3 +2032,7 @@ INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetPrimitiveRestartEnable, VkCommandB
VkBool32 primitiveRestartEnable);
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetRasterizerDiscardEnable,
VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable);
INSTANTIATE_FUNCTION_SERIALISED(void, vkCmdSetFragmentShadingRateKHR, VkCommandBuffer commandBuffer,
const VkExtent2D *pFragmentSize,
const VkFragmentShadingRateCombinerOpKHR combinerOps[2]);
@@ -1095,3 +1095,12 @@ VkResult WrappedVulkan::vkGetPhysicalDeviceToolProperties(VkPhysicalDevice physi
(*pToolCount)++;
return VK_SUCCESS;
}
VkResult WrappedVulkan::vkGetPhysicalDeviceFragmentShadingRatesKHR(
VkPhysicalDevice physicalDevice, uint32_t *pFragmentShadingRateCount,
VkPhysicalDeviceFragmentShadingRateKHR *pFragmentShadingRates)
{
return ObjDisp(physicalDevice)
->GetPhysicalDeviceFragmentShadingRatesKHR(Unwrap(physicalDevice), pFragmentShadingRateCount,
pFragmentShadingRates);
}
@@ -2141,6 +2141,8 @@ bool WrappedVulkan::Serialise_vkCreateImage(SerialiserType &ser, VkDevice device
prefix = "2D " + depth + " Attachment";
else if(CreateInfo.usage & VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT)
prefix = "2D Fragment Density Map Attachment";
else if(CreateInfo.usage & VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR)
prefix = "2D Fragment Shading Rate Attachment";
}
else if(CreateInfo.imageType == VK_IMAGE_TYPE_3D)
{
+9 -4
View File
@@ -2143,7 +2143,10 @@ void DoSerialise(SerialiserType &ser, VKPipe::Rasterizer &el)
SERIALISE_MEMBER(lineStippleFactor);
SERIALISE_MEMBER(lineStipplePattern);
SIZE_CHECK(52);
SERIALISE_MEMBER(pipelineShadingRate);
SERIALISE_MEMBER(shadingRateCombiners);
SIZE_CHECK(68);
}
template <typename SerialiserType>
@@ -2211,9 +2214,11 @@ void DoSerialise(SerialiserType &ser, VKPipe::RenderPass &el)
SERIALISE_MEMBER(depthstencilAttachment);
SERIALISE_MEMBER(depthstencilResolveAttachment);
SERIALISE_MEMBER(fragmentDensityAttachment);
SERIALISE_MEMBER(shadingRateAttachment);
SERIALISE_MEMBER(shadingRateTexelSize);
SERIALISE_MEMBER(multiviews);
SIZE_CHECK(128);
SIZE_CHECK(136);
}
template <typename SerialiserType>
@@ -2263,7 +2268,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::CurrentPass &el)
SERIALISE_MEMBER(framebuffer);
SERIALISE_MEMBER(renderArea);
SIZE_CHECK(192);
SIZE_CHECK(200);
}
template <typename SerialiserType>
@@ -2331,7 +2336,7 @@ void DoSerialise(SerialiserType &ser, VKPipe::State &el)
SERIALISE_MEMBER(conditionalRendering);
SIZE_CHECK(2016);
SIZE_CHECK(2040);
}
#pragma endregion Vulkan pipeline state