[vulkan] Fix some more sync validation errors

These were a little harder to find, especially the lighting ones.
This commit is contained in:
Bill Currie 2024-03-31 10:31:57 +09:00
parent 61e6332473
commit b632d1dc52
3 changed files with 56 additions and 27 deletions

View file

@ -843,9 +843,18 @@ lighting_update_lights (const exprval_t **params, exprval_t *result,
memcpy (eids + queue[i].start, entids[i],
sizeof (uint32_t[queue[i].count]));
}
auto ir_barrier = &bufferBarriers[qfv_BB_TransferWrite_to_IndexRead];
QFV_PacketScatterBuffer (packet, lframe->entid_buffer, 1, &eid_scatter,
ir_barrier);
&(qfv_bufferbarrier_t) {
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
.dstStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
.barrier = {
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
},
});
memset (lframe->id_radius, -1, MaxLights * sizeof (light_idrad_t));
for (int i = 0; i < ST_COUNT; i++) {
@ -1077,7 +1086,6 @@ lighting_rewrite_ids (lightingframe_t *lframe, vulkan_ctx_t *ctx)
return;
}
auto bb = &bufferBarriers[qfv_BB_TransferWrite_to_UniformRead];
auto packet = QFV_PacketAcquire (ctx->staging);
byte *packet_start = QFV_PacketExtend (packet, packet_size);
byte *packet_data = packet_start;
@ -1113,12 +1121,38 @@ lighting_rewrite_ids (lightingframe_t *lframe, vulkan_ctx_t *ctx)
enqueue_map (matrix_ids, lframe, r);
}
static qfv_bufferbarrier_t vtxattr_read = {
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
.dstStages = VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
.barrier = {
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT
| VK_ACCESS_SHADER_READ_BIT,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
},
};
static qfv_bufferbarrier_t storage_read = {
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
.dstStages = VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
| VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
.barrier = {
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
},
};
QFV_PacketScatterBuffer (packet, lframe->id_buffer, 1, &id_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
&vtxattr_read);
QFV_PacketScatterBuffer (packet, lframe->radius_buffer, 1, &radius_scatter,
&bufferBarriers[qfv_BB_TransferWrite_to_VertexAttrRead]);
&vtxattr_read);
QFV_PacketScatterBuffer (packet, lframe->shadowmat_id_buffer,
1, &matrix_id_scater, bb);
1, &matrix_id_scater, &storage_read);
QFV_PacketSubmit (packet);
transition_shadow_targets (lframe, ctx);

View file

@ -131,8 +131,6 @@ update_matrices (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
qfZoneNamed (zone, true);
auto taskctx = (qfv_taskctx_t *) ectx;
auto ctx = taskctx->ctx;
auto device = ctx->device;
auto dfunc = device->funcs;
auto mctx = ctx->matrix_context;
auto mframe = &mctx->frames.a[ctx->curFrame];
@ -150,23 +148,9 @@ update_matrices (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
qfv_matrix_buffer_t *m = QFV_PacketExtend (packet, sizeof (*m));
*m = mctx->matrices;
qfv_bufferbarrier_t bb = bufferBarriers[qfv_BB_Unknown_to_TransferWrite]; bb.barrier.buffer = mframe->buffer;
bb.barrier.size = packet->length;
dfunc->vkCmdPipelineBarrier (packet->cmd, bb.srcStages, bb.dstStages,
0, 0, 0, 1, &bb.barrier, 0, 0);
VkBufferCopy copy_region = { packet->offset, 0, packet->length };
dfunc->vkCmdCopyBuffer (packet->cmd, mctx->stage->buffer,
mframe->buffer, 1, &copy_region);
bb = bufferBarriers[qfv_BB_TransferWrite_to_UniformRead];
bb.barrier.buffer = mframe->buffer;
bb.barrier.size = packet->length;
dfunc->vkCmdPipelineBarrier (packet->cmd, bb.srcStages, bb.dstStages,
0, 0, 0, 1, &bb.barrier, 0, 0);
auto bb = bufferBarriers[qfv_BB_TransferWrite_to_UniformRead];
bb.dstStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
QFV_PacketCopyBuffer (packet, mframe->buffer, 0, &bb);
QFV_PacketSubmit (packet);
}

View file

@ -186,8 +186,19 @@ clear_translucent (const exprval_t **params, exprval_t *result, exprctx_t *ectx)
qfv_packet_t *packet = QFV_PacketAcquire (ctx->staging);
qfv_transtate_t *state = QFV_PacketExtend (packet, 2 * sizeof (*state));
*state = (qfv_transtate_t) { 0, tctx->maxFragments };
auto bb = &bufferBarriers[qfv_BB_TransferWrite_to_ShaderRW];
QFV_PacketCopyBuffer (packet, tframe->state->buffer.buffer, 0, bb);
QFV_PacketCopyBuffer (packet, tframe->state->buffer.buffer, 0,
&(qfv_bufferbarrier_t) {
.srcStages = VK_PIPELINE_STAGE_TRANSFER_BIT,
.dstStages = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
.barrier = {
.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER,
.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT
| VK_ACCESS_SHADER_WRITE_BIT,
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
},
});
QFV_PacketSubmit (packet);
}