Browse Source

[vk] VUID‑vkCmdDraw‑None‑08608 Fix

pull/2776/head
Ribbit 5 months ago
parent
commit
21af8ea597
  1. 35
      src/video_core/renderer_vulkan/vk_rasterizer.cpp
  2. 7
      src/video_core/renderer_vulkan/vk_rasterizer.h

35
src/video_core/renderer_vulkan/vk_rasterizer.cpp

@ -309,7 +309,7 @@ void RasterizerVulkan::DrawTexture() {
texture_cache.SynchronizeGraphicsDescriptors(); texture_cache.SynchronizeGraphicsDescriptors();
texture_cache.UpdateRenderTargets(false); texture_cache.UpdateRenderTargets(false);
UpdateDynamicStates();
UpdateDynamicStates(DynamicStateScope::Blit);
query_cache.CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, query_cache.CounterEnable(VideoCommon::QueryType::ZPassPixelCount64,
maxwell3d->regs.zpass_pixel_count_enable); maxwell3d->regs.zpass_pixel_count_enable);
@ -925,13 +925,22 @@ bool AccelerateDMA::BufferToImage(const Tegra::DMA::ImageCopy& copy_info,
return DmaBufferImageCopy<true>(copy_info, buffer_operand, image_operand); return DmaBufferImageCopy<true>(copy_info, buffer_operand, image_operand);
} }
void RasterizerVulkan::UpdateDynamicStates() {
void RasterizerVulkan::UpdateDynamicStates(DynamicStateScope scope) {
auto& regs = maxwell3d->regs; auto& regs = maxwell3d->regs;
UpdateViewportsState(regs); UpdateViewportsState(regs);
UpdateScissorsState(regs); UpdateScissorsState(regs);
UpdateDepthBias(regs);
const bool is_blit_scope = scope == DynamicStateScope::Blit;
if (!is_blit_scope) {
UpdateDepthBias(regs);
}
UpdateBlendConstants(regs); UpdateBlendConstants(regs);
if (is_blit_scope) {
return;
}
UpdateDepthBounds(regs); UpdateDepthBounds(regs);
UpdateStencilFaces(regs); UpdateStencilFaces(regs);
UpdateLineWidth(regs); UpdateLineWidth(regs);
@ -939,11 +948,16 @@ void RasterizerVulkan::UpdateDynamicStates() {
const u8 dynamic_state = Settings::values.dyna_state.GetValue(); const u8 dynamic_state = Settings::values.dyna_state.GetValue();
auto features = DynamicFeatures{ auto features = DynamicFeatures{
.has_extended_dynamic_state = device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0,
.has_extended_dynamic_state_2 = device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1,
.has_extended_dynamic_state_2_extra = device.IsExtExtendedDynamicState2ExtrasSupported() && dynamic_state > 1,
.has_extended_dynamic_state_3_blend = device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2,
.has_extended_dynamic_state_3_enables = device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2,
.has_extended_dynamic_state =
device.IsExtExtendedDynamicStateSupported() && dynamic_state > 0,
.has_extended_dynamic_state_2 =
device.IsExtExtendedDynamicState2Supported() && dynamic_state > 1,
.has_extended_dynamic_state_2_extra =
device.IsExtExtendedDynamicState2ExtrasSupported() && dynamic_state > 1,
.has_extended_dynamic_state_3_blend =
device.IsExtExtendedDynamicState3BlendingSupported() && dynamic_state > 2,
.has_extended_dynamic_state_3_enables =
device.IsExtExtendedDynamicState3EnablesSupported() && dynamic_state > 2,
.has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(), .has_dynamic_vertex_input = device.IsExtVertexInputDynamicStateSupported(),
}; };
@ -982,8 +996,9 @@ void RasterizerVulkan::UpdateDynamicStates() {
regs.vertex_attrib_format.end(), regs.vertex_attrib_format.end(),
In(Maxwell3D::Regs::VertexAttribute::Type::Float)); In(Maxwell3D::Regs::VertexAttribute::Type::Float));
if (regs.logic_op.enable)
if (regs.logic_op.enable) {
regs.logic_op.enable = static_cast<u32>(!has_float); regs.logic_op.enable = static_cast<u32>(!has_float);
}
UpdateLogicOpEnable(regs); UpdateLogicOpEnable(regs);
} else { } else {
@ -1003,7 +1018,7 @@ void RasterizerVulkan::UpdateDynamicStates() {
} }
if (features.has_dynamic_vertex_input) { if (features.has_dynamic_vertex_input) {
if (auto* gp = pipeline_cache.CurrentGraphicsPipeline(); if (auto* gp = pipeline_cache.CurrentGraphicsPipeline();
gp && gp->HasDynamicVertexInput()) {
gp && gp->HasDynamicVertexInput()) {
UpdateVertexInput(regs); UpdateVertexInput(regs);
} }
} }

7
src/video_core/renderer_vulkan/vk_rasterizer.h

@ -157,7 +157,12 @@ private:
void FlushWork(); void FlushWork();
void UpdateDynamicStates();
enum class DynamicStateScope {
Full,
Blit,
};
void UpdateDynamicStates(DynamicStateScope scope = DynamicStateScope::Full);
void HandleTransformFeedback(); void HandleTransformFeedback();

Loading…
Cancel
Save