vk: single call for all meshes in alias model

This commit is contained in:
Denis Pauk 2024-08-04 13:35:13 +03:00
parent c43f8f1ce3
commit a7dc338e5c

View file

@ -177,20 +177,11 @@ Mesh_Free(void)
} }
static void static void
Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffset, Vk_DrawAliasFrameLerpCommands(int *order, int *order_end, float alpha,
int *order, int *order_end, float alpha, qvkpipeline_t *pipeline, dxtrivertx_t *verts, vec4_t *s_lerped, const float *shadelight,
dxtrivertx_t *verts, vec4_t *s_lerped, int count, const float *shadelight, const float *shadevector, qboolean iscolor, int *vertIdx,
const float *shadevector, qboolean iscolor) int *pipeCounters, int *index_pos)
{ {
int vertIdx = 0, pipeCounters = 0, index_pos = 0;
if (Mesh_VertsRealloc(count))
{
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
}
drawInfo[0].firstVertex = 0;
while (1) while (1)
{ {
int count; int count;
@ -213,12 +204,12 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
pipelineIdx = TRIANGLE_STRIP; pipelineIdx = TRIANGLE_STRIP;
} }
if (Mesh_VertsRealloc(pipeCounters)) if (Mesh_VertsRealloc(*pipeCounters))
{ {
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__); Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
} }
drawInfo[pipeCounters].vertexCount = count; drawInfo[*pipeCounters].vertexCount = count;
if (iscolor) if (iscolor)
{ {
@ -226,30 +217,31 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
{ {
int index_xyz = order[2]; int index_xyz = order[2];
if (Mesh_VertsRealloc(vertIdx)) if (Mesh_VertsRealloc(*vertIdx))
{ {
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__); Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
} }
// unused in this case, since texturing is disabled // unused in this case, since texturing is disabled
vertList[vertIdx].texCoord[0] = 0.f; vertList[*vertIdx].texCoord[0] = 0.f;
vertList[vertIdx].texCoord[1] = 0.f; vertList[*vertIdx].texCoord[1] = 0.f;
vertList[vertIdx].color[0] = shadelight[0]; vertList[*vertIdx].color[0] = shadelight[0];
vertList[vertIdx].color[1] = shadelight[1]; vertList[*vertIdx].color[1] = shadelight[1];
vertList[vertIdx].color[2] = shadelight[2]; vertList[*vertIdx].color[2] = shadelight[2];
vertList[vertIdx].color[3] = alpha; vertList[*vertIdx].color[3] = alpha;
if (verts_count <= index_xyz) if (verts_count <= index_xyz)
{ {
R_Printf(PRINT_ALL, "%s: Model has issues with lerped index\n", __func__); R_Printf(PRINT_ALL, "%s: Model has issues with lerped index\n",
__func__);
return; return;
} }
vertList[vertIdx].vertex[0] = s_lerped[index_xyz][0]; vertList[*vertIdx].vertex[0] = s_lerped[index_xyz][0];
vertList[vertIdx].vertex[1] = s_lerped[index_xyz][1]; vertList[*vertIdx].vertex[1] = s_lerped[index_xyz][1];
vertList[vertIdx].vertex[2] = s_lerped[index_xyz][2]; vertList[*vertIdx].vertex[2] = s_lerped[index_xyz][2];
vertIdx++; (*vertIdx) ++;
order += 3; order += 3;
} while (--count); } while (--count);
} }
@ -261,14 +253,14 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
vec3_t normal; vec3_t normal;
float l; float l;
if (Mesh_VertsRealloc(vertIdx)) if (Mesh_VertsRealloc(*vertIdx))
{ {
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__); Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
} }
// texture coordinates come from the draw list // texture coordinates come from the draw list
vertList[vertIdx].texCoord[0] = ((float *)order)[0]; vertList[*vertIdx].texCoord[0] = ((float *)order)[0];
vertList[vertIdx].texCoord[1] = ((float *)order)[1]; vertList[*vertIdx].texCoord[1] = ((float *)order)[1];
/* unpack normal */ /* unpack normal */
for(i = 0; i < 3; i++) for(i = 0; i < 3; i++)
@ -280,64 +272,48 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
/* shadevector is set above according to rotation (around Z axis I think) */ /* shadevector is set above according to rotation (around Z axis I think) */
l = DotProduct(normal, shadevector) + 1; l = DotProduct(normal, shadevector) + 1;
vertList[vertIdx].color[0] = l * shadelight[0]; vertList[*vertIdx].color[0] = l * shadelight[0];
vertList[vertIdx].color[1] = l * shadelight[1]; vertList[*vertIdx].color[1] = l * shadelight[1];
vertList[vertIdx].color[2] = l * shadelight[2]; vertList[*vertIdx].color[2] = l * shadelight[2];
vertList[vertIdx].color[3] = alpha; vertList[*vertIdx].color[3] = alpha;
if (verts_count <= index_xyz) if (verts_count <= index_xyz)
{ {
R_Printf(PRINT_ALL, "%s: Model has issues with lerped index\n", __func__); R_Printf(PRINT_ALL, "%s: Model has issues with lerped index\n",
__func__);
return; return;
} }
vertList[vertIdx].vertex[0] = s_lerped[index_xyz][0]; vertList[*vertIdx].vertex[0] = s_lerped[index_xyz][0];
vertList[vertIdx].vertex[1] = s_lerped[index_xyz][1]; vertList[*vertIdx].vertex[1] = s_lerped[index_xyz][1];
vertList[vertIdx].vertex[2] = s_lerped[index_xyz][2]; vertList[*vertIdx].vertex[2] = s_lerped[index_xyz][2];
vertIdx++; (*vertIdx) ++;
order += 3; order += 3;
} while (--count); } while (--count);
} }
if (Mesh_VertsRealloc(pipeCounters + 1)) if (Mesh_VertsRealloc(*pipeCounters + 1))
{ {
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__); Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
} }
if (pipelineIdx == TRIANGLE_STRIP) if (pipelineIdx == TRIANGLE_STRIP)
{ {
GenStripIndexes(vertIdxData + index_pos, GenStripIndexes(vertIdxData + *index_pos,
drawInfo[pipeCounters].firstVertex, drawInfo[*pipeCounters].firstVertex,
drawInfo[pipeCounters].vertexCount - 2 + drawInfo[pipeCounters].firstVertex); drawInfo[*pipeCounters].vertexCount - 2 + drawInfo[*pipeCounters].firstVertex);
} }
else else
{ {
GenFanIndexes(vertIdxData + index_pos, GenFanIndexes(vertIdxData + *index_pos,
drawInfo[pipeCounters].firstVertex, drawInfo[*pipeCounters].firstVertex,
drawInfo[pipeCounters].vertexCount - 2 + drawInfo[pipeCounters].firstVertex); drawInfo[*pipeCounters].vertexCount - 2 + drawInfo[*pipeCounters].firstVertex);
} }
index_pos += (drawInfo[pipeCounters].vertexCount - 2) * 3; *index_pos += (drawInfo[*pipeCounters].vertexCount - 2) * 3;
pipeCounters++; (*pipeCounters)++;
drawInfo[pipeCounters].firstVertex = vertIdx; drawInfo[*pipeCounters].firstVertex = *vertIdx;
} }
VkDeviceSize vaoSize = sizeof(modelvert) * vertIdx;
VkBuffer vbo, *buffer;
VkDeviceSize vboOffset, dstOffset;
uint8_t *vertData = QVk_GetVertexBuffer(vaoSize, &vbo, &vboOffset);
memcpy(vertData, vertList, vaoSize);
QVk_BindPipeline(pipeline);
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
pipeline->layout, 0, 2, descriptorSets, 1, uboOffset);
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
buffer = UpdateIndexBuffer(vertIdxData, verts_count * sizeof(uint16_t), &dstOffset);
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, index_pos, 1, 0, 0, 0);
} }
/* /*
@ -364,6 +340,7 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
int i; int i;
int num_mesh_nodes; int num_mesh_nodes;
dmdxmesh_t *mesh_nodes; dmdxmesh_t *mesh_nodes;
int vertIdx = 0, pipeCounters = 0, index_pos = 0;
qboolean colorOnly = 0 != (currententity->flags & qboolean colorOnly = 0 != (currententity->flags &
(RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE | RF_SHELL_DOUBLE | (RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE | RF_SHELL_DOUBLE |
RF_SHELL_HALF_DAM)); RF_SHELL_HALF_DAM));
@ -425,17 +402,42 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
num_mesh_nodes = paliashdr->num_meshes; num_mesh_nodes = paliashdr->num_meshes;
mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes); mesh_nodes = (dmdxmesh_t *)((char*)paliashdr + paliashdr->ofs_meshes);
if (Mesh_VertsRealloc(Q_max(paliashdr->num_xyz, paliashdr->num_tris * 3)))
{
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
}
drawInfo[0].firstVertex = 0;
for (i = 0; i < num_mesh_nodes; i++) for (i = 0; i < num_mesh_nodes; i++)
{ {
Vk_DrawAliasFrameLerpCommands(descriptorSets, &uboOffset, Vk_DrawAliasFrameLerpCommands(
order + mesh_nodes[i].ofs_glcmds, order + mesh_nodes[i].ofs_glcmds,
order + Q_min(paliashdr->num_glcmds, order + Q_min(paliashdr->num_glcmds,
mesh_nodes[i].ofs_glcmds + mesh_nodes[i].num_glcmds), mesh_nodes[i].ofs_glcmds + mesh_nodes[i].num_glcmds),
alpha, &pipelines[translucentIdx][leftHandOffset], verts, alpha, verts, s_lerped, shadelight, shadevector,
s_lerped, Q_max(paliashdr->num_xyz, paliashdr->num_tris * 3), currententity->flags & (RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE),
shadelight, shadevector, &vertIdx, &pipeCounters, &index_pos);
currententity->flags & (RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE));
} }
VkDeviceSize vaoSize = sizeof(modelvert) * vertIdx;
VkBuffer vbo, *buffer;
VkDeviceSize vboOffset, dstOffset;
uint8_t *vertData = QVk_GetVertexBuffer(vaoSize, &vbo, &vboOffset);
memcpy(vertData, vertList, vaoSize);
QVk_BindPipeline(&pipelines[translucentIdx][leftHandOffset]);
vkCmdBindDescriptorSets(vk_activeCmdbuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
pipelines[translucentIdx][leftHandOffset].layout, 0, 2,
descriptorSets, 1, &uboOffset);
vkCmdBindVertexBuffers(vk_activeCmdbuffer, 0, 1, &vbo, &vboOffset);
buffer = UpdateIndexBuffer(vertIdxData, verts_count * sizeof(uint16_t), &dstOffset);
vkCmdBindIndexBuffer(vk_activeCmdbuffer, *buffer, dstOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(vk_activeCmdbuffer, index_pos, 1, 0, 0, 0);
} }
static void static void