GS/Vulkan: Don't track vertex buffer state

It never changes.
This commit is contained in:
Stenzek 2023-08-09 00:39:07 +10:00 committed by Connor McLaughlin
parent 2432cc6ed2
commit d48dea7273
3 changed files with 30 additions and 55 deletions

View File

@ -1313,6 +1313,8 @@ void GSDeviceVK::CommandBufferCompleted(u32 index)
void GSDeviceVK::MoveToNextCommandBuffer() void GSDeviceVK::MoveToNextCommandBuffer()
{ {
ActivateCommandBuffer((m_current_frame + 1) % NUM_COMMAND_BUFFERS); ActivateCommandBuffer((m_current_frame + 1) % NUM_COMMAND_BUFFERS);
InvalidateCachedState();
SetInitialState(m_current_command_buffer);
} }
void GSDeviceVK::ActivateCommandBuffer(u32 index) void GSDeviceVK::ActivateCommandBuffer(u32 index)
@ -2198,6 +2200,8 @@ bool GSDeviceVK::UpdateWindow()
m_window_info = m_swap_chain->GetWindowInfo(); m_window_info = m_swap_chain->GetWindowInfo();
RenderBlankFrame(); RenderBlankFrame();
InvalidateCachedState();
SetInitialState(m_current_command_buffer);
return true; return true;
} }
@ -2991,7 +2995,7 @@ void GSDeviceVK::DoMultiStretchRects(
m_index.count = icount; m_index.count = icount;
m_vertex_stream_buffer.CommitMemory(vcount * sizeof(GSVertexPT1)); m_vertex_stream_buffer.CommitMemory(vcount * sizeof(GSVertexPT1));
m_index_stream_buffer.CommitMemory(icount * sizeof(u16)); m_index_stream_buffer.CommitMemory(icount * sizeof(u16));
SetIndexBuffer(m_index_stream_buffer.GetBuffer(), 0, VK_INDEX_TYPE_UINT16); SetIndexBuffer(m_index_stream_buffer.GetBuffer());
// Even though we're batching, a cmdbuffer submit could've messed this up. // Even though we're batching, a cmdbuffer submit could've messed this up.
const GSVector4i rc(dTex->GetRect()); const GSVector4i rc(dTex->GetRect());
@ -3386,7 +3390,7 @@ void GSDeviceVK::IASetIndexBuffer(const void* index, size_t count)
std::memcpy(m_index_stream_buffer.GetCurrentHostPointer(), index, size); std::memcpy(m_index_stream_buffer.GetCurrentHostPointer(), index, size);
m_index_stream_buffer.CommitMemory(size); m_index_stream_buffer.CommitMemory(size);
SetIndexBuffer(m_index_stream_buffer.GetBuffer(), 0, VK_INDEX_TYPE_UINT16); SetIndexBuffer(m_index_stream_buffer.GetBuffer());
} }
void GSDeviceVK::OMSetRenderTargets( void GSDeviceVK::OMSetRenderTargets(
@ -3673,8 +3677,6 @@ bool GSDeviceVK::CreateBuffers()
return false; return false;
} }
SetVertexBuffer(m_vertex_stream_buffer.GetBuffer(), 0);
if (!AllocatePreinitializedGPUBuffer(EXPAND_BUFFER_SIZE, &m_expand_index_buffer, &m_expand_index_buffer_allocation, if (!AllocatePreinitializedGPUBuffer(EXPAND_BUFFER_SIZE, &m_expand_index_buffer, &m_expand_index_buffer_allocation,
VK_BUFFER_USAGE_INDEX_BUFFER_BIT, &GSDevice::GenerateExpansionIndexBuffer)) VK_BUFFER_USAGE_INDEX_BUFFER_BIT, &GSDevice::GenerateExpansionIndexBuffer))
{ {
@ -3682,6 +3684,7 @@ bool GSDeviceVK::CreateBuffers()
return false; return false;
} }
SetIndexBuffer(m_index_stream_buffer.GetBuffer());
return true; return true;
} }
@ -4447,9 +4450,7 @@ void GSDeviceVK::RenderBlankFrame()
m_swap_chain->GetCurrentTexture()->TransitionToLayout(cmdbuffer, GSTextureVK::Layout::PresentSrc); m_swap_chain->GetCurrentTexture()->TransitionToLayout(cmdbuffer, GSTextureVK::Layout::PresentSrc);
SubmitCommandBuffer(m_swap_chain.get(), !m_swap_chain->IsPresentModeSynchronizing()); SubmitCommandBuffer(m_swap_chain.get(), !m_swap_chain->IsPresentModeSynchronizing());
MoveToNextCommandBuffer(); ActivateCommandBuffer((m_current_frame + 1) % NUM_COMMAND_BUFFERS);
InvalidateCachedState();
} }
bool GSDeviceVK::DoCAS( bool GSDeviceVK::DoCAS(
@ -4863,11 +4864,6 @@ bool GSDeviceVK::BindDrawPipeline(const PipelineSelector& p)
void GSDeviceVK::InitializeState() void GSDeviceVK::InitializeState()
{ {
m_vertex_buffer = m_vertex_stream_buffer.GetBuffer();
m_vertex_buffer_offset = 0;
m_index_buffer = m_index_stream_buffer.GetBuffer();
m_index_buffer_offset = 0;
m_index_type = VK_INDEX_TYPE_UINT16;
m_current_framebuffer = VK_NULL_HANDLE; m_current_framebuffer = VK_NULL_HANDLE;
m_current_render_pass = VK_NULL_HANDLE; m_current_render_pass = VK_NULL_HANDLE;
@ -4887,6 +4883,7 @@ void GSDeviceVK::InitializeState()
m_tfx_sampler = m_point_sampler; m_tfx_sampler = m_point_sampler;
InvalidateCachedState(); InvalidateCachedState();
SetInitialState(m_current_command_buffer);
} }
bool GSDeviceVK::CreatePersistentDescriptorSets() bool GSDeviceVK::CreatePersistentDescriptorSets()
@ -4926,7 +4923,6 @@ void GSDeviceVK::ExecuteCommandBuffer(bool wait_for_completion)
{ {
EndRenderPass(); EndRenderPass();
ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks)); ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks));
InvalidateCachedState();
} }
void GSDeviceVK::ExecuteCommandBuffer(bool wait_for_completion, const char* reason, ...) void GSDeviceVK::ExecuteCommandBuffer(bool wait_for_completion, const char* reason, ...)
@ -4953,7 +4949,6 @@ void GSDeviceVK::ExecuteCommandBufferAndRestartRenderPass(bool wait_for_completi
EndRenderPass(); EndRenderPass();
ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks)); ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks));
InvalidateCachedState();
if (render_pass != VK_NULL_HANDLE) if (render_pass != VK_NULL_HANDLE)
{ {
@ -4987,11 +4982,6 @@ void GSDeviceVK::ExecuteCommandBufferForReadback()
void GSDeviceVK::InvalidateCachedState() void GSDeviceVK::InvalidateCachedState()
{ {
m_dirty_flags = ALL_DIRTY_STATE; m_dirty_flags = ALL_DIRTY_STATE;
if (m_vertex_buffer != VK_NULL_HANDLE)
m_dirty_flags |= DIRTY_FLAG_VERTEX_BUFFER;
if (m_index_buffer != VK_NULL_HANDLE)
m_dirty_flags |= DIRTY_FLAG_INDEX_BUFFER;
for (u32 i = 0; i < NUM_TFX_TEXTURES; i++) for (u32 i = 0; i < NUM_TFX_TEXTURES; i++)
m_tfx_textures[i] = m_null_texture.get(); m_tfx_textures[i] = m_null_texture.get();
m_utility_texture = m_null_texture.get(); m_utility_texture = m_null_texture.get();
@ -5006,24 +4996,12 @@ void GSDeviceVK::InvalidateCachedState()
m_utility_descriptor_set = VK_NULL_HANDLE; m_utility_descriptor_set = VK_NULL_HANDLE;
} }
void GSDeviceVK::SetVertexBuffer(VkBuffer buffer, VkDeviceSize offset) void GSDeviceVK::SetIndexBuffer(VkBuffer buffer)
{ {
if (m_vertex_buffer == buffer && m_vertex_buffer_offset == offset) if (m_index_buffer == buffer)
return;
m_vertex_buffer = buffer;
m_vertex_buffer_offset = offset;
m_dirty_flags |= DIRTY_FLAG_VERTEX_BUFFER;
}
void GSDeviceVK::SetIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType type)
{
if (m_index_buffer == buffer && m_index_buffer_offset == offset && m_index_type == type)
return; return;
m_index_buffer = buffer; m_index_buffer = buffer;
m_index_buffer_offset = offset;
m_index_type = type;
m_dirty_flags |= DIRTY_FLAG_INDEX_BUFFER; m_dirty_flags |= DIRTY_FLAG_INDEX_BUFFER;
} }
@ -5226,13 +5204,16 @@ void GSDeviceVK::SetPipeline(VkPipeline pipeline)
m_dirty_flags |= DIRTY_FLAG_PIPELINE; m_dirty_flags |= DIRTY_FLAG_PIPELINE;
} }
void GSDeviceVK::SetInitialState(VkCommandBuffer cmdbuf)
{
const VkDeviceSize buffer_offset = 0;
vkCmdBindVertexBuffers(cmdbuf, 0, 1, m_vertex_stream_buffer.GetBufferPtr(), &buffer_offset);
}
__ri void GSDeviceVK::ApplyBaseState(u32 flags, VkCommandBuffer cmdbuf) __ri void GSDeviceVK::ApplyBaseState(u32 flags, VkCommandBuffer cmdbuf)
{ {
if (flags & DIRTY_FLAG_VERTEX_BUFFER)
vkCmdBindVertexBuffers(cmdbuf, 0, 1, &m_vertex_buffer, &m_vertex_buffer_offset);
if (flags & DIRTY_FLAG_INDEX_BUFFER) if (flags & DIRTY_FLAG_INDEX_BUFFER)
vkCmdBindIndexBuffer(cmdbuf, m_index_buffer, m_index_buffer_offset, m_index_type); vkCmdBindIndexBuffer(cmdbuf, m_index_buffer, 0, VK_INDEX_TYPE_UINT16);
if (flags & DIRTY_FLAG_PIPELINE) if (flags & DIRTY_FLAG_PIPELINE)
vkCmdBindPipeline(cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, m_current_pipeline); vkCmdBindPipeline(cmdbuf, VK_PIPELINE_BIND_POINT_GRAPHICS, m_current_pipeline);
@ -5853,7 +5834,7 @@ void GSDeviceVK::UploadHWDrawVerticesAndIndices(const GSHWDrawConfig& config)
{ {
m_index.start = 0; m_index.start = 0;
m_index.count = config.nindices; m_index.count = config.nindices;
SetIndexBuffer(m_expand_index_buffer, 0, VK_INDEX_TYPE_UINT16); SetIndexBuffer(m_expand_index_buffer);
} }
else else
{ {

View File

@ -637,8 +637,7 @@ public:
bool ApplyUtilityState(bool already_execed = false); bool ApplyUtilityState(bool already_execed = false);
bool ApplyTFXState(bool already_execed = false); bool ApplyTFXState(bool already_execed = false);
void SetVertexBuffer(VkBuffer buffer, VkDeviceSize offset); void SetIndexBuffer(VkBuffer buffer);
void SetIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType type);
void SetBlendConstants(u8 color); void SetBlendConstants(u8 color);
void SetLineWidth(float width); void SetLineWidth(float width);
@ -668,13 +667,12 @@ private:
DIRTY_FLAG_UTILITY_TEXTURE = (1 << 5), DIRTY_FLAG_UTILITY_TEXTURE = (1 << 5),
DIRTY_FLAG_BLEND_CONSTANTS = (1 << 6), DIRTY_FLAG_BLEND_CONSTANTS = (1 << 6),
DIRTY_FLAG_LINE_WIDTH = (1 << 7), DIRTY_FLAG_LINE_WIDTH = (1 << 7),
DIRTY_FLAG_VERTEX_BUFFER = (1 << 8), DIRTY_FLAG_INDEX_BUFFER = (1 << 8),
DIRTY_FLAG_INDEX_BUFFER = (1 << 9), DIRTY_FLAG_VIEWPORT = (1 << 9),
DIRTY_FLAG_VIEWPORT = (1 << 10), DIRTY_FLAG_SCISSOR = (1 << 10),
DIRTY_FLAG_SCISSOR = (1 << 11), DIRTY_FLAG_PIPELINE = (1 << 11),
DIRTY_FLAG_PIPELINE = (1 << 12), DIRTY_FLAG_VS_CONSTANT_BUFFER = (1 << 12),
DIRTY_FLAG_VS_CONSTANT_BUFFER = (1 << 13), DIRTY_FLAG_PS_CONSTANT_BUFFER = (1 << 13),
DIRTY_FLAG_PS_CONSTANT_BUFFER = (1 << 14),
DIRTY_FLAG_TFX_TEXTURE_TEX = (DIRTY_FLAG_TFX_TEXTURE_0 << 0), DIRTY_FLAG_TFX_TEXTURE_TEX = (DIRTY_FLAG_TFX_TEXTURE_0 << 0),
DIRTY_FLAG_TFX_TEXTURE_PALETTE = (DIRTY_FLAG_TFX_TEXTURE_0 << 1), DIRTY_FLAG_TFX_TEXTURE_PALETTE = (DIRTY_FLAG_TFX_TEXTURE_0 << 1),
@ -684,9 +682,8 @@ private:
DIRTY_FLAG_TFX_TEXTURES = DIRTY_FLAG_TFX_TEXTURE_TEX | DIRTY_FLAG_TFX_TEXTURE_PALETTE | DIRTY_FLAG_TFX_TEXTURES = DIRTY_FLAG_TFX_TEXTURE_TEX | DIRTY_FLAG_TFX_TEXTURE_PALETTE |
DIRTY_FLAG_TFX_TEXTURE_RT | DIRTY_FLAG_TFX_TEXTURE_PRIMID, DIRTY_FLAG_TFX_TEXTURE_RT | DIRTY_FLAG_TFX_TEXTURE_PRIMID,
DIRTY_BASE_STATE = DIRTY_FLAG_VERTEX_BUFFER | DIRTY_FLAG_INDEX_BUFFER | DIRTY_FLAG_PIPELINE | DIRTY_BASE_STATE = DIRTY_FLAG_INDEX_BUFFER | DIRTY_FLAG_PIPELINE | DIRTY_FLAG_VIEWPORT | DIRTY_FLAG_SCISSOR |
DIRTY_FLAG_VIEWPORT | DIRTY_FLAG_SCISSOR | DIRTY_FLAG_BLEND_CONSTANTS | DIRTY_FLAG_BLEND_CONSTANTS | DIRTY_FLAG_LINE_WIDTH,
DIRTY_FLAG_LINE_WIDTH,
DIRTY_TFX_STATE = DIRTY_BASE_STATE | DIRTY_FLAG_TFX_TEXTURES, DIRTY_TFX_STATE = DIRTY_BASE_STATE | DIRTY_FLAG_TFX_TEXTURES,
DIRTY_UTILITY_STATE = DIRTY_BASE_STATE | DIRTY_FLAG_UTILITY_TEXTURE, DIRTY_UTILITY_STATE = DIRTY_BASE_STATE | DIRTY_FLAG_UTILITY_TEXTURE,
DIRTY_CONSTANT_BUFFER_STATE = DIRTY_FLAG_VS_CONSTANT_BUFFER | DIRTY_FLAG_PS_CONSTANT_BUFFER, DIRTY_CONSTANT_BUFFER_STATE = DIRTY_FLAG_VS_CONSTANT_BUFFER | DIRTY_FLAG_PS_CONSTANT_BUFFER,
@ -703,6 +700,7 @@ private:
void InitializeState(); void InitializeState();
bool CreatePersistentDescriptorSets(); bool CreatePersistentDescriptorSets();
void SetInitialState(VkCommandBuffer cmdbuf);
void ApplyBaseState(u32 flags, VkCommandBuffer cmdbuf); void ApplyBaseState(u32 flags, VkCommandBuffer cmdbuf);
// Which bindings/state has to be updated before the next draw. // Which bindings/state has to be updated before the next draw.
@ -710,12 +708,7 @@ private:
FeedbackLoopFlag m_current_framebuffer_feedback_loop = FeedbackLoopFlag_None; FeedbackLoopFlag m_current_framebuffer_feedback_loop = FeedbackLoopFlag_None;
bool m_warned_slow_spin = false; bool m_warned_slow_spin = false;
// input assembly
VkBuffer m_vertex_buffer = VK_NULL_HANDLE;
VkDeviceSize m_vertex_buffer_offset = 0;
VkBuffer m_index_buffer = VK_NULL_HANDLE; VkBuffer m_index_buffer = VK_NULL_HANDLE;
VkDeviceSize m_index_buffer_offset = 0;
VkIndexType m_index_type = VK_INDEX_TYPE_UINT16;
GSTextureVK* m_current_render_target = nullptr; GSTextureVK* m_current_render_target = nullptr;
GSTextureVK* m_current_depth_target = nullptr; GSTextureVK* m_current_depth_target = nullptr;

View File

@ -35,6 +35,7 @@ public:
__fi bool IsValid() const { return (m_buffer != VK_NULL_HANDLE); } __fi bool IsValid() const { return (m_buffer != VK_NULL_HANDLE); }
__fi VkBuffer GetBuffer() const { return m_buffer; } __fi VkBuffer GetBuffer() const { return m_buffer; }
__fi const VkBuffer* GetBufferPtr() const { return &m_buffer; }
__fi u8* GetHostPointer() const { return m_host_pointer; } __fi u8* GetHostPointer() const { return m_host_pointer; }
__fi u8* GetCurrentHostPointer() const { return m_host_pointer + m_current_offset; } __fi u8* GetCurrentHostPointer() const { return m_host_pointer + m_current_offset; }
__fi u32 GetCurrentSize() const { return m_size; } __fi u32 GetCurrentSize() const { return m_size; }