mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	Synchronize vertex buffer even when it doesn't require binding
This commit is contained in:
		@@ -719,9 +719,15 @@ void BufferCache<P>::BindHostVertexBuffers() {
 | 
			
		||||
    bool any_valid{false};
 | 
			
		||||
    auto& flags = maxwell3d->dirty.flags;
 | 
			
		||||
    for (u32 index = 0; index < NUM_VERTEX_BUFFERS; ++index) {
 | 
			
		||||
        const Binding& binding = channel_state->vertex_buffers[index];
 | 
			
		||||
        Buffer& buffer = slot_buffers[binding.buffer_id];
 | 
			
		||||
        TouchBuffer(buffer, binding.buffer_id);
 | 
			
		||||
        SynchronizeBuffer(buffer, binding.cpu_addr, binding.size);
 | 
			
		||||
        if (!flags[Dirty::VertexBuffer0 + index]) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        flags[Dirty::VertexBuffer0 + index] = false;
 | 
			
		||||
 | 
			
		||||
        host_bindings.min_index = std::min(host_bindings.min_index, index);
 | 
			
		||||
        host_bindings.max_index = std::max(host_bindings.max_index, index);
 | 
			
		||||
        any_valid = true;
 | 
			
		||||
@@ -735,9 +741,6 @@ void BufferCache<P>::BindHostVertexBuffers() {
 | 
			
		||||
            const Binding& binding = channel_state->vertex_buffers[index];
 | 
			
		||||
            Buffer& buffer = slot_buffers[binding.buffer_id];
 | 
			
		||||
 | 
			
		||||
            TouchBuffer(buffer, binding.buffer_id);
 | 
			
		||||
            SynchronizeBuffer(buffer, binding.cpu_addr, binding.size);
 | 
			
		||||
 | 
			
		||||
            const u32 stride = maxwell3d->regs.vertex_streams[index].stride;
 | 
			
		||||
            const u32 offset = buffer.Offset(binding.cpu_addr);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -516,15 +516,15 @@ void BufferCacheRuntime::BindVertexBuffers(VideoCommon::HostBindings<Buffer>& bi
 | 
			
		||||
        buffer_handles.push_back(handle);
 | 
			
		||||
    }
 | 
			
		||||
    if (device.IsExtExtendedDynamicStateSupported()) {
 | 
			
		||||
        scheduler.Record([bindings = bindings,
 | 
			
		||||
                          buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
        scheduler.Record([bindings = std::move(bindings),
 | 
			
		||||
                          buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindVertexBuffers2EXT(
 | 
			
		||||
                bindings.min_index, bindings.max_index - bindings.min_index, buffer_handles.data(),
 | 
			
		||||
                bindings.offsets.data(), bindings.sizes.data(), bindings.strides.data());
 | 
			
		||||
        });
 | 
			
		||||
    } else {
 | 
			
		||||
        scheduler.Record([bindings = bindings,
 | 
			
		||||
                          buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
        scheduler.Record([bindings = std::move(bindings),
 | 
			
		||||
                          buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindVertexBuffers(bindings.min_index, bindings.max_index - bindings.min_index,
 | 
			
		||||
                                     buffer_handles.data(), bindings.offsets.data());
 | 
			
		||||
        });
 | 
			
		||||
@@ -561,12 +561,12 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<
 | 
			
		||||
    for (u32 index = 0; index < bindings.buffers.size(); ++index) {
 | 
			
		||||
        buffer_handles.push_back(bindings.buffers[index]->Handle());
 | 
			
		||||
    }
 | 
			
		||||
    scheduler.Record(
 | 
			
		||||
        [bindings = bindings, buffer_handles = buffer_handles](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
            cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles.size()),
 | 
			
		||||
                                                   buffer_handles.data(), bindings.offsets.data(),
 | 
			
		||||
                                                   bindings.sizes.data());
 | 
			
		||||
        });
 | 
			
		||||
    scheduler.Record([bindings = std::move(bindings),
 | 
			
		||||
                      buffer_handles = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
 | 
			
		||||
        cmdbuf.BindTransformFeedbackBuffersEXT(0, static_cast<u32>(buffer_handles.size()),
 | 
			
		||||
                                               buffer_handles.data(), bindings.offsets.data(),
 | 
			
		||||
                                               bindings.sizes.data());
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void BufferCacheRuntime::ReserveNullBuffer() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user