vk: Use UBO for vertex environment block
This commit is contained in:
@@ -509,7 +509,7 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar)
|
|||||||
// This first set is bound persistently, so grow notifications are enabled.
|
// This first set is bound persistently, so grow notifications are enabled.
|
||||||
m_attrib_ring_info.create(VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VK_ATTRIB_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_default, "attrib buffer", 0x400000, VK_TRUE);
|
m_attrib_ring_info.create(VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VK_ATTRIB_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_default, "attrib buffer", 0x400000, VK_TRUE);
|
||||||
m_fragment_env_ring_info.create(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "fragment env buffer", 0x10000, VK_TRUE);
|
m_fragment_env_ring_info.create(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "fragment env buffer", 0x10000, VK_TRUE);
|
||||||
m_vertex_env_ring_info.create(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "vertex env buffer", 0x10000, VK_TRUE);
|
m_vertex_env_ring_info.create(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_default, "vertex env buffer", 0x10000, VK_TRUE);
|
||||||
m_fragment_texture_params_ring_info.create(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "fragment texture params buffer", 0x10000, VK_TRUE);
|
m_fragment_texture_params_ring_info.create(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "fragment texture params buffer", 0x10000, VK_TRUE);
|
||||||
m_vertex_layout_ring_info.create(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "vertex layout buffer", 0x10000, VK_TRUE);
|
m_vertex_layout_ring_info.create(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "vertex layout buffer", 0x10000, VK_TRUE);
|
||||||
m_fragment_constants_ring_info.create(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "fragment constants buffer", 0x10000, VK_TRUE);
|
m_fragment_constants_ring_info.create(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_UBO_RING_BUFFER_SIZE_M * 0x100000, vk::heap_pool_low_latency, "fragment constants buffer", 0x10000, VK_TRUE);
|
||||||
@@ -563,6 +563,11 @@ VKGSRender::VKGSRender(utils::serial* ar) noexcept : GSRender(ar)
|
|||||||
const auto& limits = m_device->gpu().get_limits();
|
const auto& limits = m_device->gpu().get_limits();
|
||||||
m_texbuffer_view_size = std::min(limits.maxTexelBufferElements, VK_ATTRIB_RING_BUFFER_SIZE_M * 0x100000u);
|
m_texbuffer_view_size = std::min(limits.maxTexelBufferElements, VK_ATTRIB_RING_BUFFER_SIZE_M * 0x100000u);
|
||||||
|
|
||||||
|
// Initialize bulk allocators
|
||||||
|
m_vertex_env_allocator = std::make_unique<rsx::data_heap::bulk_allocator<256, 96>>(
|
||||||
|
m_vertex_env_ring_info,
|
||||||
|
std::min<u32>(limits.maxUniformBufferRange / 96u, 1024u));
|
||||||
|
|
||||||
if (m_texbuffer_view_size < 0x800000)
|
if (m_texbuffer_view_size < 0x800000)
|
||||||
{
|
{
|
||||||
// Warn, only possibly expected on macOS
|
// Warn, only possibly expected on macOS
|
||||||
@@ -1951,7 +1956,9 @@ void VKGSRender::load_program_env()
|
|||||||
if (update_vertex_env)
|
if (update_vertex_env)
|
||||||
{
|
{
|
||||||
// Vertex state. Note, we're now on std430 alignment here, not hardware alignment.
|
// Vertex state. Note, we're now on std430 alignment here, not hardware alignment.
|
||||||
const auto [mem, buf] = m_vertex_env_ring_info.alloc_and_map<16, char>(96);
|
// Use the bulk allocator here
|
||||||
|
const auto mem = m_vertex_env_allocator->alloc();
|
||||||
|
auto buf = m_vertex_env_ring_info.map<char>(mem, 96);
|
||||||
|
|
||||||
m_draw_processor.fill_scale_offset_data(buf, false);
|
m_draw_processor.fill_scale_offset_data(buf, false);
|
||||||
m_draw_processor.fill_user_clip_data(buf + 64);
|
m_draw_processor.fill_user_clip_data(buf + 64);
|
||||||
@@ -1962,6 +1969,9 @@ void VKGSRender::load_program_env()
|
|||||||
|
|
||||||
m_vertex_env_ring_info.unmap();
|
m_vertex_env_ring_info.unmap();
|
||||||
m_vertex_env_dynamic_offset = mem;
|
m_vertex_env_dynamic_offset = mem;
|
||||||
|
|
||||||
|
m_vertex_env_buffer_info = m_vertex_env_ring_info.window<256>(m_vertex_env_dynamic_offset, 96, gpu_limits.maxUniformBufferRange);
|
||||||
|
m_vertex_env_dynamic_offset -= m_vertex_env_buffer_info.offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update_instancing_data)
|
if (update_instancing_data)
|
||||||
@@ -2288,6 +2298,11 @@ void VKGSRender::patch_transform_constants(rsx::context* /*ctx*/, u32 index, u32
|
|||||||
|
|
||||||
rsx::io_buffer iobuf(allocate_mem);
|
rsx::io_buffer iobuf(allocate_mem);
|
||||||
upload_transform_constants(iobuf);
|
upload_transform_constants(iobuf);
|
||||||
|
|
||||||
|
if (!iobuf.empty())
|
||||||
|
{
|
||||||
|
m_transform_constants_ring_info.unmap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VKGSRender::init_buffers(rsx::framebuffer_creation_context context, bool)
|
void VKGSRender::init_buffers(rsx::framebuffer_creation_context context, bool)
|
||||||
|
|||||||
@@ -161,6 +161,8 @@ private:
|
|||||||
u64 m_texture_parameters_dynamic_offset = 0;
|
u64 m_texture_parameters_dynamic_offset = 0;
|
||||||
u64 m_stipple_array_dynamic_offset = 0;
|
u64 m_stipple_array_dynamic_offset = 0;
|
||||||
|
|
||||||
|
std::unique_ptr<rsx::data_heap::bulk_allocator<256, 96>> m_vertex_env_allocator;
|
||||||
|
|
||||||
std::vector<vk::frame_context_t> m_frame_context_storage;
|
std::vector<vk::frame_context_t> m_frame_context_storage;
|
||||||
u32 m_max_async_frames = 0u;
|
u32 m_max_async_frames = 0u;
|
||||||
// Temp frame context to use if the real frame queue is overburdened. Only used for storage
|
// Temp frame context to use if the real frame queue is overburdened. Only used for storage
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS)
|
|||||||
|
|
||||||
OS <<
|
OS <<
|
||||||
"#version 450\n\n"
|
"#version 450\n\n"
|
||||||
|
"#extension GL_EXT_scalar_block_layout : require\n"
|
||||||
|
"#extension GL_EXT_uniform_buffer_unsized_array : require\n"
|
||||||
"#extension GL_ARB_separate_shader_objects : enable\n\n";
|
"#extension GL_ARB_separate_shader_objects : enable\n\n";
|
||||||
|
|
||||||
glsl::insert_subheader_block(OS);
|
glsl::insert_subheader_block(OS);
|
||||||
@@ -88,7 +90,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS)
|
|||||||
"#define get_user_clip_config() get_vertex_context().user_clip_configuration_bits\n\n";
|
"#define get_user_clip_config() get_vertex_context().user_clip_configuration_bits\n\n";
|
||||||
|
|
||||||
OS <<
|
OS <<
|
||||||
"layout(std430, set=0, binding=" << vk_prog->binding_table.context_buffer_location << ") readonly restrict buffer VertexContextBuffer\n"
|
"layout(std430, set=0, binding=" << vk_prog->binding_table.context_buffer_location << ") uniform VertexContextBuffer\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" vertex_context_t vertex_contexts[];\n"
|
" vertex_context_t vertex_contexts[];\n"
|
||||||
"};\n\n";
|
"};\n\n";
|
||||||
@@ -96,7 +98,7 @@ void VKVertexDecompilerThread::insertHeader(std::stringstream &OS)
|
|||||||
const vk::glsl::program_input context_input
|
const vk::glsl::program_input context_input
|
||||||
{
|
{
|
||||||
.domain = glsl::glsl_vertex_program,
|
.domain = glsl::glsl_vertex_program,
|
||||||
.type = vk::glsl::input_type_storage_buffer,
|
.type = vk::glsl::input_type_uniform_buffer,
|
||||||
.set = vk::glsl::binding_set_index_vertex,
|
.set = vk::glsl::binding_set_index_vertex,
|
||||||
.location = vk_prog->binding_table.context_buffer_location,
|
.location = vk_prog->binding_table.context_buffer_location,
|
||||||
.name = "VertexContextBuffer"
|
.name = "VertexContextBuffer"
|
||||||
|
|||||||
Reference in New Issue
Block a user