[Vulkan] EDRAM range ownership transfers, resolve clears, 2x-as-4x MSAA
Transfers are functional on a D3D12-like level, but need additional work so fallbacks are used when multisampled integer sampled images are not supported, and to eliminate transfers between render targets within Vulkan format compatibility classes by using different views directly.
This commit is contained in:
@@ -103,6 +103,37 @@ void DeferredCommandBuffer::Execute(VkCommandBuffer command_buffer) {
|
||||
args.pipeline);
|
||||
} break;
|
||||
|
||||
case Command::kVkBindVertexBuffers: {
|
||||
auto& args = *reinterpret_cast<const ArgsVkBindVertexBuffers*>(stream);
|
||||
size_t offset_bytes =
|
||||
xe::align(sizeof(ArgsVkBindVertexBuffers), alignof(VkBuffer));
|
||||
const VkBuffer* buffers = reinterpret_cast<const VkBuffer*>(
|
||||
reinterpret_cast<const uint8_t*>(stream) + offset_bytes);
|
||||
offset_bytes =
|
||||
xe::align(offset_bytes + sizeof(VkBuffer) * args.binding_count,
|
||||
alignof(VkDeviceSize));
|
||||
const VkDeviceSize* offsets = reinterpret_cast<const VkDeviceSize*>(
|
||||
reinterpret_cast<const uint8_t*>(stream) + offset_bytes);
|
||||
dfn.vkCmdBindVertexBuffers(command_buffer, args.first_binding,
|
||||
args.binding_count, buffers, offsets);
|
||||
} break;
|
||||
|
||||
case Command::kVkClearAttachments: {
|
||||
auto& args = *reinterpret_cast<const ArgsVkClearAttachments*>(stream);
|
||||
size_t offset_bytes = xe::align(sizeof(ArgsVkClearAttachments),
|
||||
alignof(VkClearAttachment));
|
||||
const VkClearAttachment* attachments =
|
||||
reinterpret_cast<const VkClearAttachment*>(
|
||||
reinterpret_cast<const uint8_t*>(stream) + offset_bytes);
|
||||
offset_bytes = xe::align(
|
||||
offset_bytes + sizeof(VkClearAttachment) * args.attachment_count,
|
||||
alignof(VkClearRect));
|
||||
const VkClearRect* rects = reinterpret_cast<const VkClearRect*>(
|
||||
reinterpret_cast<const uint8_t*>(stream) + offset_bytes);
|
||||
dfn.vkCmdClearAttachments(command_buffer, args.attachment_count,
|
||||
attachments, args.rect_count, rects);
|
||||
} break;
|
||||
|
||||
case Command::kVkCopyBuffer: {
|
||||
auto& args = *reinterpret_cast<const ArgsVkCopyBuffer*>(stream);
|
||||
dfn.vkCmdCopyBuffer(
|
||||
@@ -112,6 +143,12 @@ void DeferredCommandBuffer::Execute(VkCommandBuffer command_buffer) {
|
||||
xe::align(sizeof(ArgsVkCopyBuffer), alignof(VkBufferCopy))));
|
||||
} break;
|
||||
|
||||
case Command::kVkDispatch: {
|
||||
auto& args = *reinterpret_cast<const ArgsVkDispatch*>(stream);
|
||||
dfn.vkCmdDispatch(command_buffer, args.group_count_x,
|
||||
args.group_count_y, args.group_count_z);
|
||||
} break;
|
||||
|
||||
case Command::kVkDraw: {
|
||||
auto& args = *reinterpret_cast<const ArgsVkDraw*>(stream);
|
||||
dfn.vkCmdDraw(command_buffer, args.vertex_count, args.instance_count,
|
||||
@@ -168,6 +205,14 @@ void DeferredCommandBuffer::Execute(VkCommandBuffer command_buffer) {
|
||||
args.image_memory_barrier_count, image_memory_barriers);
|
||||
} break;
|
||||
|
||||
case Command::kVkPushConstants: {
|
||||
auto& args = *reinterpret_cast<const ArgsVkPushConstants*>(stream);
|
||||
dfn.vkCmdPushConstants(command_buffer, args.layout, args.stage_flags,
|
||||
args.offset, args.size,
|
||||
reinterpret_cast<const uint8_t*>(stream) +
|
||||
sizeof(ArgsVkPushConstants));
|
||||
} break;
|
||||
|
||||
case Command::kVkSetBlendConstants: {
|
||||
auto& args = *reinterpret_cast<const ArgsVkSetBlendConstants*>(stream);
|
||||
dfn.vkCmdSetBlendConstants(command_buffer, args.blend_constants);
|
||||
|
||||
Reference in New Issue
Block a user