mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-29 07:41:47 +00:00
vk: pregenerate index buffer in Vk_DrawAlias
This commit is contained in:
parent
06167fc711
commit
d9a240a935
3 changed files with 42 additions and 48 deletions
|
@ -1123,41 +1123,33 @@ GenStripIndexes(uint16_t *data, int from, int to)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
UpdateIndexBuffer(int index, uint16_t *data, VkDeviceSize bufferSize, VkDeviceSize *dstOffset)
|
||||||
|
{
|
||||||
|
uint16_t *iboData = NULL;
|
||||||
|
|
||||||
|
VK_VERIFY(buffer_invalidate(&vk_dynIndexBuffers[index].resource));
|
||||||
|
iboData = (uint16_t *)QVk_GetIndexBuffer(bufferSize, dstOffset, index);
|
||||||
|
memcpy(iboData, data, bufferSize);
|
||||||
|
VK_VERIFY(buffer_flush(&vk_dynIndexBuffers[index].resource));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
RebuildTriangleIndexBuffer()
|
RebuildTriangleIndexBuffer()
|
||||||
{
|
{
|
||||||
VkDeviceSize dstOffset = 0;
|
VkDeviceSize dstOffset = 0;
|
||||||
VkDeviceSize bufferSize = 3 * vk_config.triangle_index_count * sizeof(uint16_t);
|
VkDeviceSize bufferSize = 3 * vk_config.triangle_index_count * sizeof(uint16_t);
|
||||||
uint16_t *iboData = NULL;
|
uint16_t *data = malloc(bufferSize);
|
||||||
uint16_t *fanData = malloc(bufferSize);
|
|
||||||
uint16_t *stripData = malloc(bufferSize);
|
|
||||||
|
|
||||||
GenFanIndexes(fanData, 0, vk_config.triangle_index_count);
|
|
||||||
GenStripIndexes(stripData, 0, vk_config.triangle_index_count);
|
|
||||||
|
|
||||||
for (int i = 0; i < NUM_DYNBUFFERS; ++i)
|
|
||||||
{
|
|
||||||
VK_VERIFY(buffer_invalidate(&vk_dynIndexBuffers[i].resource));
|
|
||||||
|
|
||||||
iboData = (uint16_t *)QVk_GetIndexBuffer(bufferSize, &dstOffset, i);
|
|
||||||
if ((i%2) == 0)
|
|
||||||
{
|
|
||||||
memcpy(iboData, fanData, bufferSize);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy(iboData, stripData, bufferSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
VK_VERIFY(buffer_flush(&vk_dynIndexBuffers[i].resource));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
GenFanIndexes(data, 0, vk_config.triangle_index_count);
|
||||||
|
UpdateIndexBuffer(0, data, bufferSize, &dstOffset);
|
||||||
vk_triangleFanIbo = &vk_dynIndexBuffers[0].resource.buffer;
|
vk_triangleFanIbo = &vk_dynIndexBuffers[0].resource.buffer;
|
||||||
vk_triangleStripIbo = &vk_dynIndexBuffers[1].resource.buffer;
|
|
||||||
vk_triangleFanIboUsage = ((bufferSize % 4) == 0) ? bufferSize : (bufferSize + 4 - (bufferSize % 4));
|
|
||||||
|
|
||||||
free(fanData);
|
GenStripIndexes(data, 0, vk_config.triangle_index_count);
|
||||||
free(stripData);
|
UpdateIndexBuffer(1, data, bufferSize, &dstOffset);
|
||||||
|
vk_triangleStripIbo = &vk_dynIndexBuffers[1].resource.buffer;
|
||||||
|
|
||||||
|
free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CreateStagingBuffer(VkDeviceSize size, qvkstagingbuffer_t *dstBuffer, int i)
|
static void CreateStagingBuffer(VkDeviceSize size, qvkstagingbuffer_t *dstBuffer, int i)
|
||||||
|
@ -2167,6 +2159,8 @@ qboolean QVk_Init(void)
|
||||||
CreateStagingBuffers();
|
CreateStagingBuffers();
|
||||||
// assign a dynamic index buffer for triangle fan emulation
|
// assign a dynamic index buffer for triangle fan emulation
|
||||||
RebuildTriangleIndexBuffer();
|
RebuildTriangleIndexBuffer();
|
||||||
|
vk_triangleFanIboUsage = ROUNDUP(3 * vk_config.triangle_index_count * sizeof(uint16_t), 4);
|
||||||
|
|
||||||
CreatePipelines();
|
CreatePipelines();
|
||||||
CreateSamplers();
|
CreateSamplers();
|
||||||
|
|
||||||
|
@ -2653,8 +2647,11 @@ QVk_CheckTriangleIbo(VkDeviceSize indexCount)
|
||||||
if (indexCount > vk_config.triangle_index_count)
|
if (indexCount > vk_config.triangle_index_count)
|
||||||
{
|
{
|
||||||
vk_config.triangle_index_count *= BUFFER_RESIZE_FACTOR;
|
vk_config.triangle_index_count *= BUFFER_RESIZE_FACTOR;
|
||||||
R_Printf(PRINT_ALL, "Resizing triangle index buffer to %u indices.\n", vk_config.triangle_index_count);
|
R_Printf(PRINT_ALL, "%s: Resizing triangle index buffer to %u indices.\n",
|
||||||
|
__func__, vk_config.triangle_index_count);
|
||||||
RebuildTriangleIndexBuffer();
|
RebuildTriangleIndexBuffer();
|
||||||
|
|
||||||
|
vk_triangleFanIboUsage = ROUNDUP(3 * vk_config.triangle_index_count * sizeof(uint16_t), 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -191,17 +191,20 @@ static void
|
||||||
Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffset,
|
Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffset,
|
||||||
int *order, int *order_end, float alpha, qvkpipeline_t *pipeline,
|
int *order, int *order_end, float alpha, qvkpipeline_t *pipeline,
|
||||||
dxtrivertx_t *verts, vec4_t *s_lerped, int verts_count, const float *shadelight,
|
dxtrivertx_t *verts, vec4_t *s_lerped, int verts_count, const float *shadelight,
|
||||||
const float *shadevector, qboolean iscolor, int numtis)
|
const float *shadevector, qboolean iscolor, int num_tris)
|
||||||
{
|
{
|
||||||
int vertCounts[2] = { 0, 0 };
|
int vertCounts[2] = { 0, 0 };
|
||||||
int pipeCounters[2] = { 0, 0 };
|
int pipeCounters[2] = { 0, 0 };
|
||||||
VkDeviceSize maxTriangleFanIdxCnt = 0;
|
VkBuffer fan, strip;
|
||||||
|
|
||||||
if (Mesh_VertsRealloc(verts_count))
|
if (Mesh_VertsRealloc(verts_count))
|
||||||
{
|
{
|
||||||
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
|
Com_Error(ERR_FATAL, "%s: can't allocate memory", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fan = QVk_GetTriangleFanIbo(num_tris);
|
||||||
|
strip = QVk_GetTriangleStripIbo(num_tris);
|
||||||
|
|
||||||
drawInfo[0][0].firstVertex = 0;
|
drawInfo[0][0].firstVertex = 0;
|
||||||
drawInfo[1][0].firstVertex = 0;
|
drawInfo[1][0].firstVertex = 0;
|
||||||
|
|
||||||
|
@ -233,7 +236,6 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
|
||||||
}
|
}
|
||||||
|
|
||||||
drawInfo[pipelineIdx][pipeCounters[pipelineIdx]].vertexCount = count;
|
drawInfo[pipelineIdx][pipeCounters[pipelineIdx]].vertexCount = count;
|
||||||
maxTriangleFanIdxCnt = Q_max(maxTriangleFanIdxCnt, ((count - 2) * 3));
|
|
||||||
|
|
||||||
if (iscolor)
|
if (iscolor)
|
||||||
{
|
{
|
||||||
|
@ -325,10 +327,6 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
|
||||||
drawInfo[pipelineIdx][pipeCounters[pipelineIdx]].firstVertex = vertCounts[pipelineIdx];
|
drawInfo[pipelineIdx][pipeCounters[pipelineIdx]].firstVertex = vertCounts[pipelineIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
VkBuffer fan, strip;
|
|
||||||
fan = QVk_GetTriangleFanIbo(numtis);
|
|
||||||
strip = QVk_GetTriangleStripIbo(numtis);
|
|
||||||
|
|
||||||
for (int p = 0; p < 2; p++)
|
for (int p = 0; p < 2; p++)
|
||||||
{
|
{
|
||||||
VkDeviceSize vaoSize = sizeof(modelvert) * vertCounts[p];
|
VkDeviceSize vaoSize = sizeof(modelvert) * vertCounts[p];
|
||||||
|
@ -346,7 +344,7 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, strip, 0, VK_INDEX_TYPE_UINT16);
|
vkCmdBindIndexBuffer(vk_activeCmdbuffer, strip, 0 /* buffer offset */, VK_INDEX_TYPE_UINT16);
|
||||||
|
|
||||||
for (i = 0; i < pipeCounters[p]; i++)
|
for (i = 0; i < pipeCounters[p]; i++)
|
||||||
{
|
{
|
||||||
|
@ -357,7 +355,7 @@ Vk_DrawAliasFrameLerpCommands(VkDescriptorSet *descriptorSets, uint32_t *uboOffs
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, fan, 0, VK_INDEX_TYPE_UINT16);
|
vkCmdBindIndexBuffer(vk_activeCmdbuffer, fan, 0 /* buffer offset */, VK_INDEX_TYPE_UINT16);
|
||||||
|
|
||||||
for (i = 0; i < pipeCounters[p]; i++)
|
for (i = 0; i < pipeCounters[p]; i++)
|
||||||
{
|
{
|
||||||
|
@ -468,9 +466,13 @@ Vk_DrawAliasFrameLerp(entity_t *currententity, dmdx_t *paliashdr, float backlerp
|
||||||
static void
|
static void
|
||||||
Vk_DrawAliasShadow(int *order, int *order_end, int posenum,
|
Vk_DrawAliasShadow(int *order, int *order_end, int posenum,
|
||||||
float height, float lheight, vec4_t *s_lerped, const float *shadevector,
|
float height, float lheight, vec4_t *s_lerped, const float *shadevector,
|
||||||
uint32_t *uboOffset, VkDescriptorSet *uboDescriptorSet
|
uint32_t *uboOffset, VkDescriptorSet *uboDescriptorSet, int num_tris)
|
||||||
)
|
|
||||||
{
|
{
|
||||||
|
VkBuffer fan, strip;
|
||||||
|
|
||||||
|
fan = QVk_GetTriangleFanIbo(num_tris);
|
||||||
|
strip = QVk_GetTriangleStripIbo(num_tris);
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
int i, count;
|
int i, count;
|
||||||
|
@ -538,12 +540,12 @@ Vk_DrawAliasShadow(int *order, int *order_end, int posenum,
|
||||||
|
|
||||||
if (pipelineIdx == TRIANGLE_STRIP)
|
if (pipelineIdx == TRIANGLE_STRIP)
|
||||||
{
|
{
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, QVk_GetTriangleStripIbo((i - 2) * 3), 0, VK_INDEX_TYPE_UINT16);
|
vkCmdBindIndexBuffer(vk_activeCmdbuffer, strip, 0, VK_INDEX_TYPE_UINT16);
|
||||||
vkCmdDrawIndexed(vk_activeCmdbuffer, (i - 2) * 3, 1, 0, 0, 0);
|
vkCmdDrawIndexed(vk_activeCmdbuffer, (i - 2) * 3, 1, 0, 0, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
vkCmdBindIndexBuffer(vk_activeCmdbuffer, QVk_GetTriangleFanIbo((i - 2) * 3), 0, VK_INDEX_TYPE_UINT16);
|
vkCmdBindIndexBuffer(vk_activeCmdbuffer, fan, 0, VK_INDEX_TYPE_UINT16);
|
||||||
vkCmdDrawIndexed(vk_activeCmdbuffer, (i - 2) * 3, 1, 0, 0, 0);
|
vkCmdDrawIndexed(vk_activeCmdbuffer, (i - 2) * 3, 1, 0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -900,7 +902,8 @@ R_DrawAliasModel(entity_t *currententity, const model_t *currentmodel)
|
||||||
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),
|
||||||
currententity->frame, height, lheight,
|
currententity->frame, height, lheight,
|
||||||
s_lerped, shadevector, &uboOffset, &uboDescriptorSet);
|
s_lerped, shadevector, &uboOffset, &uboDescriptorSet,
|
||||||
|
paliashdr->num_tris);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,7 +312,6 @@ void Vk_Mem_f(void)
|
||||||
vk_config.vertex_buffer_size / 1024,
|
vk_config.vertex_buffer_size / 1024,
|
||||||
100.f * vk_config.vertex_buffer_usage / vk_config.vertex_buffer_size,
|
100.f * vk_config.vertex_buffer_usage / vk_config.vertex_buffer_size,
|
||||||
vk_config.vertex_buffer_max_usage / 1024);
|
vk_config.vertex_buffer_max_usage / 1024);
|
||||||
|
|
||||||
R_Printf(PRINT_ALL, "Index : %u/%uB (%.1f%% max: %uB)\n",
|
R_Printf(PRINT_ALL, "Index : %u/%uB (%.1f%% max: %uB)\n",
|
||||||
vk_config.index_buffer_usage,
|
vk_config.index_buffer_usage,
|
||||||
vk_config.index_buffer_size,
|
vk_config.index_buffer_size,
|
||||||
|
@ -323,9 +322,4 @@ void Vk_Mem_f(void)
|
||||||
vk_config.uniform_buffer_size / 1024,
|
vk_config.uniform_buffer_size / 1024,
|
||||||
100.f * vk_config.uniform_buffer_usage / vk_config.uniform_buffer_size,
|
100.f * vk_config.uniform_buffer_usage / vk_config.uniform_buffer_size,
|
||||||
vk_config.uniform_buffer_max_usage / 1024);
|
vk_config.uniform_buffer_max_usage / 1024);
|
||||||
R_Printf(PRINT_ALL, "Triangle index: %u/%u (%.1f%% max: %u)\n",
|
|
||||||
vk_config.triangle_index_usage,
|
|
||||||
vk_config.triangle_index_count,
|
|
||||||
100.f * vk_config.triangle_index_usage / vk_config.triangle_index_count,
|
|
||||||
vk_config.triangle_index_max_usage);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue