mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-11-12 12:20:12 +01:00
[TEST] Adjustments on TransformFeedback
This commit is contained in:
parent
0cd5dd1e70
commit
25af655e48
4 changed files with 24 additions and 9 deletions
|
|
@ -654,6 +654,7 @@ void BufferCacheRuntime::BindTransformFeedbackBuffer(u32 index, VkBuffer buffer,
|
||||||
offset = 0;
|
offset = 0;
|
||||||
size = 0;
|
size = 0;
|
||||||
}
|
}
|
||||||
|
scheduler.MarkTransformFeedbackUsed();
|
||||||
scheduler.Record([index, buffer, offset, size](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([index, buffer, offset, size](vk::CommandBuffer cmdbuf) {
|
||||||
const VkDeviceSize vk_offset = offset;
|
const VkDeviceSize vk_offset = offset;
|
||||||
const VkDeviceSize vk_size = size;
|
const VkDeviceSize vk_size = size;
|
||||||
|
|
@ -666,19 +667,26 @@ void BufferCacheRuntime::BindTransformFeedbackBuffers(VideoCommon::HostBindings<
|
||||||
// Already logged in the rasterizer
|
// Already logged in the rasterizer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boost::container::static_vector<VkBuffer, VideoCommon::NUM_VERTEX_BUFFERS> buffer_handles(bindings.buffers.size());
|
const u32 count = std::min<u32>(static_cast<u32>(bindings.buffers.size()),
|
||||||
for (u32 i = 0; i < bindings.buffers.size(); ++i) {
|
VideoCommon::NUM_TRANSFORM_FEEDBACK_BUFFERS);
|
||||||
|
std::array<VkBuffer, VideoCommon::NUM_TRANSFORM_FEEDBACK_BUFFERS> handles{};
|
||||||
|
std::array<VkDeviceSize, VideoCommon::NUM_TRANSFORM_FEEDBACK_BUFFERS> offsets{};
|
||||||
|
std::array<VkDeviceSize, VideoCommon::NUM_TRANSFORM_FEEDBACK_BUFFERS> sizes{};
|
||||||
|
for (u32 i = 0; i < count; ++i) {
|
||||||
auto handle = bindings.buffers[i]->Handle();
|
auto handle = bindings.buffers[i]->Handle();
|
||||||
if (handle == VK_NULL_HANDLE) {
|
if (handle == VK_NULL_HANDLE) {
|
||||||
ReserveNullBuffer();
|
ReserveNullBuffer();
|
||||||
handle = *null_buffer;
|
handle = *null_buffer;
|
||||||
bindings.offsets[i] = 0;
|
} else {
|
||||||
bindings.sizes[i] = 0;
|
offsets[i] = bindings.offsets[i];
|
||||||
|
sizes[i] = bindings.sizes[i];
|
||||||
}
|
}
|
||||||
buffer_handles[i] = handle;
|
handles[i] = handle;
|
||||||
}
|
}
|
||||||
scheduler.Record([bindings_ = std::move(bindings), buffer_handles_ = std::move(buffer_handles)](vk::CommandBuffer cmdbuf) {
|
scheduler.MarkTransformFeedbackUsed();
|
||||||
cmdbuf.BindTransformFeedbackBuffersEXT(0, u32(buffer_handles_.size()), buffer_handles_.data(), bindings_.offsets.data(), bindings_.sizes.data());
|
scheduler.Record([count, handles, offsets, sizes](vk::CommandBuffer cmdbuf) {
|
||||||
|
cmdbuf.BindTransformFeedbackBuffersEXT(0, count, handles.data(), offsets.data(),
|
||||||
|
sizes.data());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -919,7 +919,7 @@ private:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
has_flushed_end_pending = true;
|
has_flushed_end_pending = true;
|
||||||
// Refresh buffers state before beginning transform feedback so counters are up-to-date
|
scheduler.MarkTransformFeedbackUsed();
|
||||||
UpdateBuffers();
|
UpdateBuffers();
|
||||||
if (!has_started || buffers_count == 0) {
|
if (!has_started || buffers_count == 0) {
|
||||||
// No counter buffers available: begin without counters
|
// No counter buffers available: begin without counters
|
||||||
|
|
|
||||||
|
|
@ -536,7 +536,7 @@ void Scheduler::EndRenderPass()
|
||||||
Record([num_images = num_renderpass_images,
|
Record([num_images = num_renderpass_images,
|
||||||
images = renderpass_images,
|
images = renderpass_images,
|
||||||
ranges = renderpass_image_ranges,
|
ranges = renderpass_image_ranges,
|
||||||
has_transform_feedback = device.IsExtTransformFeedbackSupported(),
|
has_transform_feedback = state.uses_transform_feedback,
|
||||||
dynamic_rendering = device.IsKhrDynamicRenderingSupported()](
|
dynamic_rendering = device.IsKhrDynamicRenderingSupported()](
|
||||||
vk::CommandBuffer cmdbuf) {
|
vk::CommandBuffer cmdbuf) {
|
||||||
std::array<VkImageMemoryBarrier, 9> barriers;
|
std::array<VkImageMemoryBarrier, 9> barriers;
|
||||||
|
|
@ -599,6 +599,7 @@ void Scheduler::EndRenderPass()
|
||||||
state.framebuffer = VkFramebuffer{};
|
state.framebuffer = VkFramebuffer{};
|
||||||
state.attachment_views = {};
|
state.attachment_views = {};
|
||||||
state.rendering = false;
|
state.rendering = false;
|
||||||
|
state.uses_transform_feedback = false;
|
||||||
num_renderpass_images = 0;
|
num_renderpass_images = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,11 @@ public:
|
||||||
return state.rendering;
|
return state.rendering;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Flags that transform feedback writes have been recorded since the last render pass end.
|
||||||
|
void MarkTransformFeedbackUsed() noexcept {
|
||||||
|
state.uses_transform_feedback = true;
|
||||||
|
}
|
||||||
|
|
||||||
/// Update the pipeline to the current execution context.
|
/// Update the pipeline to the current execution context.
|
||||||
bool UpdateGraphicsPipeline(GraphicsPipeline* pipeline);
|
bool UpdateGraphicsPipeline(GraphicsPipeline* pipeline);
|
||||||
|
|
||||||
|
|
@ -277,6 +282,7 @@ private:
|
||||||
bool is_rescaling = false;
|
bool is_rescaling = false;
|
||||||
bool rescaling_defined = false;
|
bool rescaling_defined = false;
|
||||||
bool needs_state_enable_refresh = false;
|
bool needs_state_enable_refresh = false;
|
||||||
|
bool uses_transform_feedback = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DeferredClear {
|
struct DeferredClear {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue