mirror of https://github.com/PCSX2/pcsx2.git
GS/Vulkan: Don't track vertex buffer state
It never changes.
This commit is contained in:
parent
2432cc6ed2
commit
d48dea7273
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Reference in New Issue