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