mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-22 18:53:28 +01:00
vk: Implement explicit runtime flags to manage events like heap sync
This commit is contained in:
parent
f359342721
commit
357e0d2097
@ -2831,8 +2831,7 @@ void VKGSRender::close_and_submit_command_buffer(VkFence fence, VkSemaphore wait
|
|||||||
// Wait before sync block below
|
// Wait before sync block below
|
||||||
rsx::g_dma_manager.sync();
|
rsx::g_dma_manager.sync();
|
||||||
|
|
||||||
// TODO: Better check for shadowed memory
|
if (vk::test_status_interrupt(vk::heap_check))
|
||||||
//if (m_attrib_ring_info.shadow)
|
|
||||||
{
|
{
|
||||||
if (m_attrib_ring_info.dirty() ||
|
if (m_attrib_ring_info.dirty() ||
|
||||||
m_fragment_env_ring_info.dirty() ||
|
m_fragment_env_ring_info.dirty() ||
|
||||||
@ -2862,6 +2861,8 @@ void VKGSRender::close_and_submit_command_buffer(VkFence fence, VkSemaphore wait
|
|||||||
m_secondary_command_buffer.submit(m_swapchain->get_graphics_queue(),
|
m_secondary_command_buffer.submit(m_swapchain->get_graphics_queue(),
|
||||||
VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
|
VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vk::clear_status_interrupt(vk::heap_check);
|
||||||
}
|
}
|
||||||
|
|
||||||
// End any active renderpasses; the caller should handle reopening
|
// End any active renderpasses; the caller should handle reopening
|
||||||
|
@ -78,7 +78,7 @@ namespace vk
|
|||||||
|
|
||||||
VkSampler g_null_sampler = nullptr;
|
VkSampler g_null_sampler = nullptr;
|
||||||
|
|
||||||
atomic_t<bool> g_cb_no_interrupt_flag { false };
|
rsx::atomic_bitmask_t<runtime_state, u64> g_runtime_state;
|
||||||
|
|
||||||
// Driver compatibility workarounds
|
// Driver compatibility workarounds
|
||||||
VkFlags g_heap_compatible_buffer_types = 0;
|
VkFlags g_heap_compatible_buffer_types = 0;
|
||||||
@ -426,7 +426,7 @@ namespace vk
|
|||||||
void set_current_renderer(const vk::render_device &device)
|
void set_current_renderer(const vk::render_device &device)
|
||||||
{
|
{
|
||||||
g_current_renderer = &device;
|
g_current_renderer = &device;
|
||||||
g_cb_no_interrupt_flag.store(false);
|
g_runtime_state.clear();
|
||||||
g_drv_no_primitive_restart_flag = false;
|
g_drv_no_primitive_restart_flag = false;
|
||||||
g_drv_sanitize_fp_values = false;
|
g_drv_sanitize_fp_values = false;
|
||||||
g_drv_disable_fence_reset = false;
|
g_drv_disable_fence_reset = false;
|
||||||
@ -780,19 +780,34 @@ namespace vk
|
|||||||
image->current_layout = new_layout;
|
image->current_layout = new_layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void raise_status_interrupt(runtime_state status)
|
||||||
|
{
|
||||||
|
g_runtime_state |= status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear_status_interrupt(runtime_state status)
|
||||||
|
{
|
||||||
|
g_runtime_state.clear(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool test_status_interrupt(runtime_state status)
|
||||||
|
{
|
||||||
|
return g_runtime_state & status;
|
||||||
|
}
|
||||||
|
|
||||||
void enter_uninterruptible()
|
void enter_uninterruptible()
|
||||||
{
|
{
|
||||||
g_cb_no_interrupt_flag = true;
|
raise_status_interrupt(runtime_state::uninterruptible);
|
||||||
}
|
}
|
||||||
|
|
||||||
void leave_uninterruptible()
|
void leave_uninterruptible()
|
||||||
{
|
{
|
||||||
g_cb_no_interrupt_flag = false;
|
clear_status_interrupt(runtime_state::uninterruptible);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_uninterruptible()
|
bool is_uninterruptible()
|
||||||
{
|
{
|
||||||
return g_cb_no_interrupt_flag;
|
return test_status_interrupt(runtime_state::uninterruptible);
|
||||||
}
|
}
|
||||||
|
|
||||||
void advance_completed_frame_counter()
|
void advance_completed_frame_counter()
|
||||||
|
@ -70,6 +70,11 @@ namespace vk
|
|||||||
void *pUserData);
|
void *pUserData);
|
||||||
|
|
||||||
//VkAllocationCallbacks default_callbacks();
|
//VkAllocationCallbacks default_callbacks();
|
||||||
|
enum runtime_state
|
||||||
|
{
|
||||||
|
uninterruptible = 1,
|
||||||
|
heap_check = 2
|
||||||
|
};
|
||||||
|
|
||||||
enum class driver_vendor
|
enum class driver_vendor
|
||||||
{
|
{
|
||||||
@ -203,7 +208,9 @@ namespace vk
|
|||||||
VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlags src_mask, VkAccessFlags dst_mask,
|
VkPipelineStageFlags src_stage, VkPipelineStageFlags dst_stage, VkAccessFlags src_mask, VkAccessFlags dst_mask,
|
||||||
const VkImageSubresourceRange& range);
|
const VkImageSubresourceRange& range);
|
||||||
|
|
||||||
//Manage 'uininterruptible' state where secondary operations (e.g violation handlers) will have to wait
|
void raise_status_interrupt(runtime_state status);
|
||||||
|
void clear_status_interrupt(runtime_state status);
|
||||||
|
bool test_status_interrupt(runtime_state status);
|
||||||
void enter_uninterruptible();
|
void enter_uninterruptible();
|
||||||
void leave_uninterruptible();
|
void leave_uninterruptible();
|
||||||
bool is_uninterruptible();
|
bool is_uninterruptible();
|
||||||
@ -3452,6 +3459,7 @@ public:
|
|||||||
if (shadow)
|
if (shadow)
|
||||||
{
|
{
|
||||||
dirty_ranges.push_back({offset, offset, size});
|
dirty_ranges.push_back({offset, offset, size});
|
||||||
|
raise_status_interrupt(runtime_state::heap_check);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (u8*)_ptr + offset;
|
return (u8*)_ptr + offset;
|
||||||
|
Loading…
Reference in New Issue
Block a user