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()
{
ActivateCommandBuffer((m_current_frame + 1) % NUM_COMMAND_BUFFERS);
InvalidateCachedState();
SetInitialState(m_current_command_buffer);
}
void GSDeviceVK::ActivateCommandBuffer(u32 index)
@ -2198,6 +2200,8 @@ bool GSDeviceVK::UpdateWindow()
m_window_info = m_swap_chain->GetWindowInfo();
RenderBlankFrame();
InvalidateCachedState();
SetInitialState(m_current_command_buffer);
return true;
}
@ -2991,7 +2995,7 @@ void GSDeviceVK::DoMultiStretchRects(
m_index.count = icount;
m_vertex_stream_buffer.CommitMemory(vcount * sizeof(GSVertexPT1));
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.
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);
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(
@ -3673,8 +3677,6 @@ bool GSDeviceVK::CreateBuffers()
return false;
}
SetVertexBuffer(m_vertex_stream_buffer.GetBuffer(), 0);
if (!AllocatePreinitializedGPUBuffer(EXPAND_BUFFER_SIZE, &m_expand_index_buffer, &m_expand_index_buffer_allocation,
VK_BUFFER_USAGE_INDEX_BUFFER_BIT, &GSDevice::GenerateExpansionIndexBuffer))
{
@ -3682,6 +3684,7 @@ bool GSDeviceVK::CreateBuffers()
return false;
}
SetIndexBuffer(m_index_stream_buffer.GetBuffer());
return true;
}
@ -4447,9 +4450,7 @@ void GSDeviceVK::RenderBlankFrame()
m_swap_chain->GetCurrentTexture()->TransitionToLayout(cmdbuffer, GSTextureVK::Layout::PresentSrc);
SubmitCommandBuffer(m_swap_chain.get(), !m_swap_chain->IsPresentModeSynchronizing());
MoveToNextCommandBuffer();
InvalidateCachedState();
ActivateCommandBuffer((m_current_frame + 1) % NUM_COMMAND_BUFFERS);
}
bool GSDeviceVK::DoCAS(
@ -4863,11 +4864,6 @@ bool GSDeviceVK::BindDrawPipeline(const PipelineSelector& p)
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_render_pass = VK_NULL_HANDLE;
@ -4887,6 +4883,7 @@ void GSDeviceVK::InitializeState()
m_tfx_sampler = m_point_sampler;
InvalidateCachedState();
SetInitialState(m_current_command_buffer);
}
bool GSDeviceVK::CreatePersistentDescriptorSets()
@ -4926,7 +4923,6 @@ void GSDeviceVK::ExecuteCommandBuffer(bool wait_for_completion)
{
EndRenderPass();
ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks));
InvalidateCachedState();
}
void GSDeviceVK::ExecuteCommandBuffer(bool wait_for_completion, const char* reason, ...)
@ -4953,7 +4949,6 @@ void GSDeviceVK::ExecuteCommandBufferAndRestartRenderPass(bool wait_for_completi
EndRenderPass();
ExecuteCommandBuffer(GetWaitType(wait_for_completion, GSConfig.HWSpinCPUForReadbacks));
InvalidateCachedState();
if (render_pass != VK_NULL_HANDLE)
{
@ -4987,11 +4982,6 @@ void GSDeviceVK::ExecuteCommandBufferForReadback()
void GSDeviceVK::InvalidateCachedState()
{
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++)
m_tfx_textures[i] = 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;
}
void GSDeviceVK::SetVertexBuffer(VkBuffer buffer, VkDeviceSize offset)
void GSDeviceVK::SetIndexBuffer(VkBuffer buffer)
{
if (m_vertex_buffer == buffer && m_vertex_buffer_offset == offset)
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)
if (m_index_buffer == buffer)
return;
m_index_buffer = buffer;
m_index_buffer_offset = offset;
m_index_type = type;
m_dirty_flags |= DIRTY_FLAG_INDEX_BUFFER;
}
@ -5226,13 +5204,16 @@ void GSDeviceVK::SetPipeline(VkPipeline 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)
{
if (flags & DIRTY_FLAG_VERTEX_BUFFER)
vkCmdBindVertexBuffers(cmdbuf, 0, 1, &m_vertex_buffer, &m_vertex_buffer_offset);
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)
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.count = config.nindices;
SetIndexBuffer(m_expand_index_buffer, 0, VK_INDEX_TYPE_UINT16);
SetIndexBuffer(m_expand_index_buffer);
}
else
{

View File

@ -637,8 +637,7 @@ public:
bool ApplyUtilityState(bool already_execed = false);
bool ApplyTFXState(bool already_execed = false);
void SetVertexBuffer(VkBuffer buffer, VkDeviceSize offset);
void SetIndexBuffer(VkBuffer buffer, VkDeviceSize offset, VkIndexType type);
void SetIndexBuffer(VkBuffer buffer);
void SetBlendConstants(u8 color);
void SetLineWidth(float width);
@ -668,13 +667,12 @@ private:
DIRTY_FLAG_UTILITY_TEXTURE = (1 << 5),
DIRTY_FLAG_BLEND_CONSTANTS = (1 << 6),
DIRTY_FLAG_LINE_WIDTH = (1 << 7),
DIRTY_FLAG_VERTEX_BUFFER = (1 << 8),
DIRTY_FLAG_INDEX_BUFFER = (1 << 9),
DIRTY_FLAG_VIEWPORT = (1 << 10),
DIRTY_FLAG_SCISSOR = (1 << 11),
DIRTY_FLAG_PIPELINE = (1 << 12),
DIRTY_FLAG_VS_CONSTANT_BUFFER = (1 << 13),
DIRTY_FLAG_PS_CONSTANT_BUFFER = (1 << 14),
DIRTY_FLAG_INDEX_BUFFER = (1 << 8),
DIRTY_FLAG_VIEWPORT = (1 << 9),
DIRTY_FLAG_SCISSOR = (1 << 10),
DIRTY_FLAG_PIPELINE = (1 << 11),
DIRTY_FLAG_VS_CONSTANT_BUFFER = (1 << 12),
DIRTY_FLAG_PS_CONSTANT_BUFFER = (1 << 13),
DIRTY_FLAG_TFX_TEXTURE_TEX = (DIRTY_FLAG_TFX_TEXTURE_0 << 0),
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_TEXTURE_RT | DIRTY_FLAG_TFX_TEXTURE_PRIMID,
DIRTY_BASE_STATE = DIRTY_FLAG_VERTEX_BUFFER | DIRTY_FLAG_INDEX_BUFFER | DIRTY_FLAG_PIPELINE |
DIRTY_FLAG_VIEWPORT | DIRTY_FLAG_SCISSOR | DIRTY_FLAG_BLEND_CONSTANTS |
DIRTY_FLAG_LINE_WIDTH,
DIRTY_BASE_STATE = DIRTY_FLAG_INDEX_BUFFER | DIRTY_FLAG_PIPELINE | DIRTY_FLAG_VIEWPORT | DIRTY_FLAG_SCISSOR |
DIRTY_FLAG_BLEND_CONSTANTS | DIRTY_FLAG_LINE_WIDTH,
DIRTY_TFX_STATE = DIRTY_BASE_STATE | DIRTY_FLAG_TFX_TEXTURES,
DIRTY_UTILITY_STATE = DIRTY_BASE_STATE | DIRTY_FLAG_UTILITY_TEXTURE,
DIRTY_CONSTANT_BUFFER_STATE = DIRTY_FLAG_VS_CONSTANT_BUFFER | DIRTY_FLAG_PS_CONSTANT_BUFFER,
@ -703,6 +700,7 @@ private:
void InitializeState();
bool CreatePersistentDescriptorSets();
void SetInitialState(VkCommandBuffer cmdbuf);
void ApplyBaseState(u32 flags, VkCommandBuffer cmdbuf);
// Which bindings/state has to be updated before the next draw.
@ -710,12 +708,7 @@ private:
FeedbackLoopFlag m_current_framebuffer_feedback_loop = FeedbackLoopFlag_None;
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;
VkDeviceSize m_index_buffer_offset = 0;
VkIndexType m_index_type = VK_INDEX_TYPE_UINT16;
GSTextureVK* m_current_render_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 VkBuffer GetBuffer() const { return m_buffer; }
__fi const VkBuffer* GetBufferPtr() const { return &m_buffer; }
__fi u8* GetHostPointer() const { return m_host_pointer; }
__fi u8* GetCurrentHostPointer() const { return m_host_pointer + m_current_offset; }
__fi u32 GetCurrentSize() const { return m_size; }