Revert some previous changes partially + maintenance5 changes

This commit is contained in:
CamilleLaVey
2026-09-17 17:19:27 -04:00
parent 377478cd46
commit 10528f1ceb
8 changed files with 114 additions and 31 deletions
@@ -578,29 +578,40 @@ bool BufferCacheRuntime::BindMultiRangeStorageBuffer(u64 key, bool is_written) {
void BufferCacheRuntime::BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format,
u32 base_vertex, u32 num_indices, VkBuffer buffer,
u32 offset, [[maybe_unused]] u32 size) {
u32 offset, u32 size) {
VkIndexType vk_index_type = MaxwellToVK::IndexFormat(index_format);
VkDeviceSize vk_offset = offset;
VkDeviceSize vk_size = size;
VkBuffer vk_buffer = buffer;
if (topology == PrimitiveTopology::Quads || topology == PrimitiveTopology::QuadStrip) {
vk_index_type = VK_INDEX_TYPE_UINT32;
vk_size = VK_WHOLE_SIZE;
std::tie(vk_buffer, vk_offset) =
quad_index_pass.Assemble(index_format, num_indices, base_vertex, buffer, offset,
topology == PrimitiveTopology::QuadStrip);
} else if (vk_index_type == VK_INDEX_TYPE_UINT8_EXT && !device.IsExtIndexTypeUint8Supported()) {
vk_index_type = VK_INDEX_TYPE_UINT16;
if (uint8_pass) {
vk_size = VK_WHOLE_SIZE;
std::tie(vk_buffer, vk_offset) = uint8_pass->Assemble(num_indices, buffer, offset);
} else if (device.GetDriverID() == VK_DRIVER_ID_QUALCOMM_PROPRIETARY) {
ReserveNullBuffer();
vk_buffer = *null_buffer;
vk_offset = 0;
vk_size = VK_WHOLE_SIZE;
}
}
if (vk_buffer == VK_NULL_HANDLE) {
// Vulkan doesn't support null index buffers. Replace it with our own null buffer.
ReserveNullBuffer();
vk_buffer = *null_buffer;
vk_size = VK_WHOLE_SIZE;
}
if (device.IsKhrMaintenance5Supported()) {
scheduler.Record([vk_buffer, vk_offset, vk_size, vk_index_type](vk::CommandBuffer cmdbuf) {
cmdbuf.BindIndexBuffer2KHR(vk_buffer, vk_offset, vk_size, vk_index_type);
});
return;
}
scheduler.Record([vk_buffer, vk_offset, vk_index_type](vk::CommandBuffer cmdbuf) {
cmdbuf.BindIndexBuffer(vk_buffer, vk_offset, vk_index_type);
@@ -342,7 +342,17 @@ std::pair<VkBuffer, VkDeviceSize> QuadIndexedPass::Assemble(
return 2;
}();
const u32 input_size = num_vertices << index_shift;
const u32 num_tri_vertices = (is_strip ? (num_vertices - 2) / 2 : num_vertices / 4) * 6;
u32 quads = num_vertices / 4;
if (is_strip) {
quads = 0;
if (num_vertices >= 2) {
quads = (num_vertices - 2) / 2;
}
}
if (quads == 0) {
quads = 1;
}
const u32 num_tri_vertices = quads * 6;
const std::size_t staging_size = num_tri_vertices * sizeof(u32);
const auto staging = staging_buffer_pool.Request(staging_size, MemoryUsage::DeviceLocal);
@@ -212,8 +212,6 @@ RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra
compute_pass_descriptor_queue(device, UpdateDescriptorQueue::COMPUTE_FRAME_PAYLOAD_SIZE),
descriptor_buffer_ring(device, memory_allocator),
blit_image(device, scheduler, state_tracker, descriptor_pool), render_pass_cache(device),
indirect_quads_pass(device, scheduler, descriptor_pool, staging_pool,
compute_pass_descriptor_queue),
texture_cache_runtime{
device, scheduler, memory_allocator, staging_pool,
blit_image, render_pass_cache, descriptor_pool, compute_pass_descriptor_queue},
@@ -319,15 +317,6 @@ void RasterizerVulkan::DrawIndirect() {
VkBuffer command_buffer = buffer->Handle();
VkDeviceSize command_offset = offset;
u32 command_stride = static_cast<u32>(params.stride);
if (params.is_indexed &&
maxwell3d->draw_manager.draw_state.topology == Maxwell::PrimitiveTopology::Quads) {
const auto patched = indirect_quads_pass.Assemble(
static_cast<u32>(params.max_draw_counts), command_stride, command_buffer,
static_cast<u32>(offset));
command_buffer = patched.first;
command_offset = patched.second;
command_stride = IndirectQuadsPass::COMMAND_WORDS * static_cast<u32>(sizeof(u32));
}
if (params.is_byte_count) {
scheduler.Record([buffer_obj = buffer->Handle(), offset,
stride = params.stride](vk::CommandBuffer cmdbuf) {
@@ -17,7 +17,6 @@
#include "video_core/rasterizer_interface.h"
#include "video_core/renderer_vulkan/blit_image.h"
#include "video_core/renderer_vulkan/vk_buffer_cache.h"
#include "video_core/renderer_vulkan/vk_compute_pass.h"
#include "video_core/renderer_vulkan/vk_descriptor_buffer.h"
#include "video_core/renderer_vulkan/vk_descriptor_pool.h"
#include "video_core/renderer_vulkan/vk_fence_manager.h"
@@ -212,7 +211,6 @@ private:
DescriptorBufferRing descriptor_buffer_ring;
BlitImageHelper blit_image;
RenderPassCache render_pass_cache;
IndirectQuadsPass indirect_quads_pass;
TextureCacheRuntime texture_cache_runtime;
TextureCache texture_cache;