mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
[vulkan] Use correct descriptor set for core quads
The problem was that I had mixed up the purpose of the per-frame vertex buffers and used them for the core quad data when they were meant for subpic and the like, and forgotten about the static vertex buffer. This gets at least conchars working (pic in general not tested yet).
This commit is contained in:
parent
8fff71ed4b
commit
77fc6355cc
1 changed files with 37 additions and 21 deletions
|
@ -128,7 +128,7 @@ typedef struct drawframe_s {
|
||||||
size_t line_offset;
|
size_t line_offset;
|
||||||
VkBuffer instance_buffer;
|
VkBuffer instance_buffer;
|
||||||
VkBufferView dvert_view;
|
VkBufferView dvert_view;
|
||||||
VkDescriptorSet core_quad_set;
|
VkDescriptorSet dyn_quad_set;
|
||||||
|
|
||||||
descbatchset_t quad_batch;
|
descbatchset_t quad_batch;
|
||||||
quadqueue_t quad_insts;
|
quadqueue_t quad_insts;
|
||||||
|
@ -174,7 +174,7 @@ typedef struct drawctx_s {
|
||||||
hashtab_t *pic_cache;
|
hashtab_t *pic_cache;
|
||||||
qfv_resource_t *draw_resource;
|
qfv_resource_t *draw_resource;
|
||||||
qfv_resobj_t *index_object;
|
qfv_resobj_t *index_object;
|
||||||
qfv_resobj_t *svertex_object;
|
qfv_resobj_t *svertex_objects;
|
||||||
qfv_resobj_t *instance_objects;
|
qfv_resobj_t *instance_objects;
|
||||||
qfv_resobj_t *dvertex_objects;
|
qfv_resobj_t *dvertex_objects;
|
||||||
uint32_t svertex_index;
|
uint32_t svertex_index;
|
||||||
|
@ -185,6 +185,7 @@ typedef struct drawctx_s {
|
||||||
VkPipelineLayout quad_layout;
|
VkPipelineLayout quad_layout;
|
||||||
VkDescriptorSetLayout quad_data_set_layout;
|
VkDescriptorSetLayout quad_data_set_layout;
|
||||||
VkDescriptorPool quad_pool;
|
VkDescriptorPool quad_pool;
|
||||||
|
VkDescriptorSet core_quad_set;
|
||||||
drawframeset_t frames;
|
drawframeset_t frames;
|
||||||
drawfontset_t fonts;
|
drawfontset_t fonts;
|
||||||
} drawctx_t;
|
} drawctx_t;
|
||||||
|
@ -239,8 +240,8 @@ create_buffers (vulkan_ctx_t *ctx)
|
||||||
// frames instance buffers
|
// frames instance buffers
|
||||||
+ (frames) * sizeof (qfv_resobj_t));
|
+ (frames) * sizeof (qfv_resobj_t));
|
||||||
dctx->index_object = (qfv_resobj_t *) &dctx->draw_resource[2];
|
dctx->index_object = (qfv_resobj_t *) &dctx->draw_resource[2];
|
||||||
dctx->svertex_object = &dctx->index_object[1];
|
dctx->svertex_objects = &dctx->index_object[1];
|
||||||
dctx->dvertex_objects = &dctx->svertex_object[2];
|
dctx->dvertex_objects = &dctx->svertex_objects[2];
|
||||||
dctx->instance_objects = &dctx->dvertex_objects[2 * frames];
|
dctx->instance_objects = &dctx->dvertex_objects[2 * frames];
|
||||||
|
|
||||||
dctx->svertex_index = 0;
|
dctx->svertex_index = 0;
|
||||||
|
@ -250,7 +251,7 @@ create_buffers (vulkan_ctx_t *ctx)
|
||||||
.name = "draw",
|
.name = "draw",
|
||||||
.va_ctx = ctx->va_ctx,
|
.va_ctx = ctx->va_ctx,
|
||||||
.memory_properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
|
.memory_properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
|
||||||
.num_objects = 2, // quad and 9-slice indices
|
.num_objects = 1 + 2, // quad and 9-slice indices, and static verts
|
||||||
.objects = dctx->index_object,
|
.objects = dctx->index_object,
|
||||||
};
|
};
|
||||||
dctx->draw_resource[1] = (qfv_resource_t) {
|
dctx->draw_resource[1] = (qfv_resource_t) {
|
||||||
|
@ -270,7 +271,7 @@ create_buffers (vulkan_ctx_t *ctx)
|
||||||
| VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
|
| VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
dctx->svertex_object[0] = (qfv_resobj_t) {
|
dctx->svertex_objects[0] = (qfv_resobj_t) {
|
||||||
.name = "sverts",
|
.name = "sverts",
|
||||||
.type = qfv_res_buffer,
|
.type = qfv_res_buffer,
|
||||||
.buffer = {
|
.buffer = {
|
||||||
|
@ -279,14 +280,14 @@ create_buffers (vulkan_ctx_t *ctx)
|
||||||
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
|
| VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
dctx->svertex_object[1] = (qfv_resobj_t) {
|
dctx->svertex_objects[1] = (qfv_resobj_t) {
|
||||||
.name = "sverts",
|
.name = "sverts",
|
||||||
.type = qfv_res_buffer_view,
|
.type = qfv_res_buffer_view,
|
||||||
.buffer_view = {
|
.buffer_view = {
|
||||||
.buffer = 1,
|
.buffer = 1,
|
||||||
.format = VK_FORMAT_R32G32B32A32_SFLOAT,
|
.format = VK_FORMAT_R32G32B32A32_SFLOAT,
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = dctx->svertex_object[0].buffer.size,
|
.size = dctx->svertex_objects[0].buffer.size,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -492,9 +493,10 @@ Vulkan_Draw_Shutdown (vulkan_ctx_t *ctx)
|
||||||
|
|
||||||
QFV_DestroyResource (device, &dctx->draw_resource[0]);
|
QFV_DestroyResource (device, &dctx->draw_resource[0]);
|
||||||
QFV_DestroyResource (device, &dctx->draw_resource[1]);
|
QFV_DestroyResource (device, &dctx->draw_resource[1]);
|
||||||
// the first "font" is reserved for the core quad data set and is dynamic
|
// the first two "fonts" are reserved for the dynamic and core quad data
|
||||||
// and thus does not have its own resources
|
// sets and thus does not have its own resources (they are created
|
||||||
for (size_t i = 1; i < dctx->fonts.size; i++) {
|
// separately)
|
||||||
|
for (size_t i = 2; i < dctx->fonts.size; i++) {
|
||||||
QFV_DestroyResource (device, &dctx->fonts.a[i].resource->resource);
|
QFV_DestroyResource (device, &dctx->fonts.a[i].resource->resource);
|
||||||
free (dctx->fonts.a[i].resource);
|
free (dctx->fonts.a[i].resource);
|
||||||
}
|
}
|
||||||
|
@ -534,7 +536,7 @@ create_quad (int x, int y, int w, int h, qpic_t *pic, vulkan_ctx_t *ctx)
|
||||||
|
|
||||||
int ind = dctx->svertex_index;
|
int ind = dctx->svertex_index;
|
||||||
dctx->svertex_index += VERTS_PER_QUAD;
|
dctx->svertex_index += VERTS_PER_QUAD;
|
||||||
QFV_PacketCopyBuffer (packet, dctx->svertex_object[0].buffer.buffer,
|
QFV_PacketCopyBuffer (packet, dctx->svertex_objects[0].buffer.buffer,
|
||||||
ind * sizeof (quadvert_t),
|
ind * sizeof (quadvert_t),
|
||||||
&bufferBarriers[qfv_BB_TransferWrite_to_UniformRead]);
|
&bufferBarriers[qfv_BB_TransferWrite_to_UniformRead]);
|
||||||
QFV_PacketSubmit (packet);
|
QFV_PacketSubmit (packet);
|
||||||
|
@ -630,7 +632,8 @@ Vulkan_Draw_Init (vulkan_ctx_t *ctx)
|
||||||
dctx->quad_data_set_layout = sl;
|
dctx->quad_data_set_layout = sl;
|
||||||
dctx->quad_pool = Vulkan_CreateDescriptorPool (ctx, "quad_pool");
|
dctx->quad_pool = Vulkan_CreateDescriptorPool (ctx, "quad_pool");
|
||||||
|
|
||||||
__auto_type layouts = QFV_AllocDescriptorSetLayoutSet (frames, alloca);
|
// core set + dynamic sets
|
||||||
|
__auto_type layouts = QFV_AllocDescriptorSetLayoutSet (1 + frames, alloca);
|
||||||
for (size_t i = 0; i < layouts->size; i++) {
|
for (size_t i = 0; i < layouts->size; i++) {
|
||||||
layouts->a[i] = dctx->quad_data_set_layout;
|
layouts->a[i] = dctx->quad_data_set_layout;
|
||||||
}
|
}
|
||||||
|
@ -643,24 +646,38 @@ Vulkan_Draw_Init (vulkan_ctx_t *ctx)
|
||||||
|
|
||||||
__auto_type pool = dctx->quad_pool;
|
__auto_type pool = dctx->quad_pool;
|
||||||
__auto_type sets = QFV_AllocateDescriptorSet (device, pool, layouts);
|
__auto_type sets = QFV_AllocateDescriptorSet (device, pool, layouts);
|
||||||
for (size_t i = 0; i < sets->size; i++) {
|
for (size_t i = 1; i < sets->size; i++) {
|
||||||
__auto_type frame = &dctx->frames.a[i];
|
__auto_type frame = &dctx->frames.a[i - 1];
|
||||||
frame->core_quad_set = sets->a[i];
|
frame->dyn_quad_set = sets->a[i];
|
||||||
VkWriteDescriptorSet write[] = {
|
VkWriteDescriptorSet write[] = {
|
||||||
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0,
|
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0,
|
||||||
frame->core_quad_set, 0, 0, 1,
|
frame->dyn_quad_set, 0, 0, 1,
|
||||||
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
|
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
|
||||||
&imageInfo, 0, 0 },
|
&imageInfo, 0, 0 },
|
||||||
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0,
|
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0,
|
||||||
frame->core_quad_set, 1, 0, 1,
|
frame->dyn_quad_set, 1, 0, 1,
|
||||||
VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
|
VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
|
||||||
0, 0, &frame->dvert_view },
|
0, 0, &frame->dvert_view },
|
||||||
};
|
};
|
||||||
dfunc->vkUpdateDescriptorSets (device->dev, 2, write, 0, 0);
|
dfunc->vkUpdateDescriptorSets (device->dev, 2, write, 0, 0);
|
||||||
}
|
}
|
||||||
|
dctx->core_quad_set = sets->a[0];
|
||||||
free (sets);
|
free (sets);
|
||||||
|
|
||||||
|
VkWriteDescriptorSet write[] = {
|
||||||
|
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0,
|
||||||
|
dctx->core_quad_set, 0, 0, 1,
|
||||||
|
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
|
||||||
|
&imageInfo, 0, 0 },
|
||||||
|
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0,
|
||||||
|
dctx->core_quad_set, 1, 0, 1,
|
||||||
|
VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
|
||||||
|
0, 0, &dctx->svertex_objects[1].buffer_view.view },
|
||||||
|
};
|
||||||
|
dfunc->vkUpdateDescriptorSets (device->dev, 2, write, 0, 0);
|
||||||
|
|
||||||
DARRAY_APPEND (&dctx->fonts, (drawfont_t) {});
|
DARRAY_APPEND (&dctx->fonts, (drawfont_t) {});
|
||||||
|
DARRAY_APPEND (&dctx->fonts, (drawfont_t) { .set = dctx->core_quad_set });
|
||||||
|
|
||||||
for (size_t i = 0; i < frames; i++) {
|
for (size_t i = 0; i < frames; i++) {
|
||||||
__auto_type dframe = &dctx->frames.a[i];
|
__auto_type dframe = &dctx->frames.a[i];
|
||||||
|
@ -723,7 +740,7 @@ queue_character (int x, int y, byte chr, vulkan_ctx_t *ctx)
|
||||||
drawframe_t *frame = &dctx->frames.a[ctx->curFrame];
|
drawframe_t *frame = &dctx->frames.a[ctx->curFrame];
|
||||||
|
|
||||||
byte color[4] = {255, 255, 255, 255};
|
byte color[4] = {255, 255, 255, 255};
|
||||||
draw_quad (x, y, 0, dctx->conchar_inds[chr], color, frame);
|
draw_quad (x, y, 1, dctx->conchar_inds[chr], color, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1166,7 +1183,6 @@ draw_quads (qfv_renderframe_t *rFrame, VkCommandBuffer cmd)
|
||||||
uint32_t inst_count = dframe->quad_batch.a[i].count;
|
uint32_t inst_count = dframe->quad_batch.a[i].count;
|
||||||
uint32_t ind_count = inst_count >> 24;
|
uint32_t ind_count = inst_count >> 24;
|
||||||
inst_count &= 0xffffff;
|
inst_count &= 0xffffff;
|
||||||
printf ("%zd %d %d %d\n", i, fontid, inst_count, ind_count);
|
|
||||||
VkDescriptorSet set[2] = {
|
VkDescriptorSet set[2] = {
|
||||||
Vulkan_Matrix_Descriptors (ctx, ctx->curFrame),
|
Vulkan_Matrix_Descriptors (ctx, ctx->curFrame),
|
||||||
dctx->fonts.a[fontid].set,
|
dctx->fonts.a[fontid].set,
|
||||||
|
@ -1218,7 +1234,7 @@ Vulkan_FlushText (qfv_renderframe_t *rFrame)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dctx->fonts.a[0].set = dframe->core_quad_set;
|
dctx->fonts.a[0].set = dframe->dyn_quad_set;
|
||||||
|
|
||||||
VkDeviceMemory memory = dctx->draw_resource[1].memory;
|
VkDeviceMemory memory = dctx->draw_resource[1].memory;
|
||||||
size_t atom = device->physDev->properties->limits.nonCoherentAtomSize;
|
size_t atom = device->physDev->properties->limits.nonCoherentAtomSize;
|
||||||
|
|
Loading…
Reference in a new issue