1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2025-02-17 14:54:20 +01:00

started adding code to correct handle indices but doesnt work yet

This commit is contained in:
yours3lf 2020-06-15 23:33:23 +01:00
parent afa6104ba0
commit 80d90ca190
5 changed files with 153 additions and 8 deletions

View File

@ -57,11 +57,7 @@ void clInsertNewCLMarker(ControlList* cl,
CLMarker marker = {0}; CLMarker marker = {0};
marker.memGuard = 0xDDDDDDDD; marker.memGuard = 0xDDDDDDDD;
marker.handlesBufOffset = 0;
marker.shaderRecBufOffset = 0;
marker.uniformsBufOffset = 0;
marker.nextMarkerOffset = -1; marker.nextMarkerOffset = -1;
marker.numDrawCallsSubmitted = 0;
//close current marker //close current marker
if(cl->currMarkerOffset != ~0u && !((CLMarker*)getCPAptrFromOffset(cl->CPA, cl->currMarkerOffset))->size) if(cl->currMarkerOffset != ~0u && !((CLMarker*)getCPAptrFromOffset(cl->CPA, cl->currMarkerOffset))->size)

View File

@ -56,6 +56,14 @@ typedef struct CLMarker
//uint8_t* uniformsBuf; // //uint8_t* uniformsBuf; //
uint32_t uniformsBufOffset; uint32_t uniformsBufOffset;
uint32_t uniformsSize; uint32_t uniformsSize;
//secondary commandbuffer handle index relocations
uint32_t uniformRelocOffset;
uint32_t uniformRelocSize;
uint32_t gemRelocOffset;
uint32_t gemRelocSize;
uint32_t shaderRecRelocOffset;
uint32_t shaderRecRelocSize;
} CLMarker; } CLMarker;
typedef struct ControlList typedef struct ControlList

View File

@ -132,6 +132,10 @@ VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkAllocateCommandBuffers)(
clInit(&pCommandBuffers[c]->shaderRecCl, &cp->cpa, consecutivePoolAllocate(&cp->cpa, 1), cp->cpa.blockSize); clInit(&pCommandBuffers[c]->shaderRecCl, &cp->cpa, consecutivePoolAllocate(&cp->cpa, 1), cp->cpa.blockSize);
clInit(&pCommandBuffers[c]->uniformsCl, &cp->cpa, consecutivePoolAllocate(&cp->cpa, 1), cp->cpa.blockSize); clInit(&pCommandBuffers[c]->uniformsCl, &cp->cpa, consecutivePoolAllocate(&cp->cpa, 1), cp->cpa.blockSize);
clInit(&pCommandBuffers[c]->uniformRelocCl, &cp->cpa, consecutivePoolAllocate(&cp->cpa, 1), cp->cpa.blockSize);
clInit(&pCommandBuffers[c]->gemRelocCl, &cp->cpa, consecutivePoolAllocate(&cp->cpa, 1), cp->cpa.blockSize);
clInit(&pCommandBuffers[c]->shaderRecRelocCl, &cp->cpa, consecutivePoolAllocate(&cp->cpa, 1), cp->cpa.blockSize);
pCommandBuffers[c]->graphicsPipeline = 0; pCommandBuffers[c]->graphicsPipeline = 0;
pCommandBuffers[c]->computePipeline = 0; pCommandBuffers[c]->computePipeline = 0;
pCommandBuffers[c]->indexBuffer = 0; pCommandBuffers[c]->indexBuffer = 0;
@ -179,6 +183,24 @@ VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkAllocateCommandBuffers)(
res = VK_ERROR_OUT_OF_HOST_MEMORY; res = VK_ERROR_OUT_OF_HOST_MEMORY;
break; break;
} }
if(pCommandBuffers[c]->uniformRelocCl.offset == ~0u)
{
res = VK_ERROR_OUT_OF_HOST_MEMORY;
break;
}
if(pCommandBuffers[c]->gemRelocCl.offset == ~0u)
{
res = VK_ERROR_OUT_OF_HOST_MEMORY;
break;
}
if(pCommandBuffers[c]->shaderRecRelocCl.offset == ~0u)
{
res = VK_ERROR_OUT_OF_HOST_MEMORY;
break;
}
} }
} }
@ -192,6 +214,10 @@ VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkAllocateCommandBuffers)(
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->handlesCl.offset), pCommandBuffers[c]->handlesCl.numBlocks); consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->handlesCl.offset), pCommandBuffers[c]->handlesCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->shaderRecCl.offset), pCommandBuffers[c]->shaderRecCl.numBlocks); consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->shaderRecCl.offset), pCommandBuffers[c]->shaderRecCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->uniformsCl.offset), pCommandBuffers[c]->uniformsCl.numBlocks); consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->uniformsCl.offset), pCommandBuffers[c]->uniformsCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->uniformRelocCl.offset), pCommandBuffers[c]->uniformRelocCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->gemRelocCl.offset), pCommandBuffers[c]->gemRelocCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->shaderRecRelocCl.offset), pCommandBuffers[c]->shaderRecRelocCl.numBlocks);
poolFree(&cp->pa, pCommandBuffers[c]); poolFree(&cp->pa, pCommandBuffers[c]);
pCommandBuffers[c] = 0; pCommandBuffers[c] = 0;
} }
@ -570,7 +596,7 @@ VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkQueueSubmit)(
submitCl.shader_rec_count = marker->shaderRecCount; submitCl.shader_rec_count = marker->shaderRecCount;
submitCl.uniforms_size = marker->uniformsSize; submitCl.uniforms_size = marker->uniformsSize;
/** /**/
printf("BCL:\n"); printf("BCL:\n");
uint8_t* mem = malloc(marker->size); uint8_t* mem = malloc(marker->size);
memcpy(mem, marker+1, marker->size); memcpy(mem, marker+1, marker->size);
@ -750,6 +776,10 @@ VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkFreeCommandBuffers)(
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->handlesCl.offset), pCommandBuffers[c]->handlesCl.numBlocks); consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->handlesCl.offset), pCommandBuffers[c]->handlesCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->shaderRecCl.offset), pCommandBuffers[c]->shaderRecCl.numBlocks); consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->shaderRecCl.offset), pCommandBuffers[c]->shaderRecCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->uniformsCl.offset), pCommandBuffers[c]->uniformsCl.numBlocks); consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->uniformsCl.offset), pCommandBuffers[c]->uniformsCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->uniformRelocCl.offset), pCommandBuffers[c]->uniformRelocCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->gemRelocCl.offset), pCommandBuffers[c]->gemRelocCl.numBlocks);
consecutivePoolFree(&cp->cpa, getCPAptrFromOffset(&cp->cpa, pCommandBuffers[c]->shaderRecRelocCl.offset), pCommandBuffers[c]->shaderRecRelocCl.numBlocks);
poolFree(&cp->pa, pCommandBuffers[c]); poolFree(&cp->pa, pCommandBuffers[c]);
} }
} }
@ -903,6 +933,14 @@ VKAPI_ATTR VkResult VKAPI_CALL RPIFUNC(vkResetCommandBuffer)(
commandBuffer->uniformsCl.nextFreeByteOffset = commandBuffer->uniformsCl.offset; commandBuffer->uniformsCl.nextFreeByteOffset = commandBuffer->uniformsCl.offset;
commandBuffer->uniformsCl.currMarkerOffset = -1; commandBuffer->uniformsCl.currMarkerOffset = -1;
commandBuffer->uniformRelocCl.nextFreeByteOffset = commandBuffer->uniformRelocCl.offset;
commandBuffer->uniformRelocCl.currMarkerOffset = -1;
commandBuffer->gemRelocCl.nextFreeByteOffset = commandBuffer->gemRelocCl.offset;
commandBuffer->gemRelocCl.currMarkerOffset = -1;
commandBuffer->shaderRecRelocCl.nextFreeByteOffset = commandBuffer->shaderRecRelocCl.offset;
commandBuffer->shaderRecRelocCl.currMarkerOffset = -1;
commandBuffer->graphicsPipeline = 0; commandBuffer->graphicsPipeline = 0;
commandBuffer->computePipeline = 0; commandBuffer->computePipeline = 0;
commandBuffer->indexBuffer = 0; commandBuffer->indexBuffer = 0;
@ -956,6 +994,34 @@ VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdExecuteCommands)(
if(!secondaryMarker->size) if(!secondaryMarker->size)
{ {
clCloseCurrentMarker(&secondary->binCl, &secondary->handlesCl, &secondary->shaderRecCl, secondary->shaderRecCount, &secondary->uniformsCl); clCloseCurrentMarker(&secondary->binCl, &secondary->handlesCl, &secondary->shaderRecCl, secondary->shaderRecCount, &secondary->uniformsCl);
secondaryMarker->uniformRelocSize = secondary->uniformRelocCl.nextFreeByteOffset - (secondaryMarker->uniformRelocOffset + secondary->uniformRelocCl.offset);
secondaryMarker->gemRelocSize = secondary->gemRelocCl.nextFreeByteOffset - (secondaryMarker->gemRelocOffset + secondary->gemRelocCl.offset);
secondaryMarker->shaderRecRelocSize = secondary->shaderRecRelocCl.nextFreeByteOffset - (secondaryMarker->shaderRecRelocOffset + secondary->shaderRecRelocCl.offset);
}
for(uint32_t d = 0; d < secondaryMarker->uniformRelocSize; ++d)
{
uint32_t offset = *(uint32_t*)getCPAptrFromOffset(secondary->uniformRelocCl.CPA, secondaryMarker->uniformRelocOffset + secondary->uniformRelocCl.offset);
uint32_t* handleIdx = getCPAptrFromOffset(secondary->uniformsCl.CPA, secondary->uniformsCl.offset + offset);
*handleIdx += primary->handlesCl.nextFreeByteOffset - primary->handlesCl.offset;
}
for(uint32_t d = 0; d < secondaryMarker->gemRelocSize; ++d)
{
uint32_t offset = *(uint32_t*)getCPAptrFromOffset(secondary->gemRelocCl.CPA, secondaryMarker->gemRelocOffset + secondary->gemRelocCl.offset);
uint32_t* handleIdx = getCPAptrFromOffset(secondary->binCl.CPA, secondary->binCl.offset + offset);
*handleIdx += primary->handlesCl.nextFreeByteOffset - primary->handlesCl.offset;
}
for(uint32_t d = 0; d < secondaryMarker->shaderRecRelocSize; ++d)
{
uint32_t offset = *(uint32_t*)getCPAptrFromOffset(secondary->shaderRecRelocCl.CPA, secondaryMarker->shaderRecRelocOffset + secondary->shaderRecRelocCl.offset);
uint32_t* handleIdx = getCPAptrFromOffset(secondary->shaderRecCl.CPA, secondary->shaderRecCl.offset + offset);
*handleIdx += primary->handlesCl.nextFreeByteOffset - primary->handlesCl.offset;
} }
clFit(&primary->binCl, secondaryMarker->size); clFit(&primary->binCl, secondaryMarker->size);
@ -965,11 +1031,36 @@ VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdExecuteCommands)(
//TODO handles/handle indices might be grabled up like this... //TODO handles/handle indices might be grabled up like this...
clFit(&primary->handlesCl, secondaryMarker->handlesSize); clFit(&primary->handlesCl, secondaryMarker->handlesSize);
clInsertData(&primary->handlesCl, secondaryMarker->handlesSize, getCPAptrFromOffset(secondary->handlesCl.CPA, secondaryMarker->handlesBufOffset)); clInsertData(&primary->handlesCl, secondaryMarker->handlesSize, getCPAptrFromOffset(secondary->handlesCl.CPA, secondaryMarker->handlesBufOffset + secondary->handlesCl.offset));
clFit(&primary->uniformsCl, secondaryMarker->uniformsSize); clFit(&primary->uniformsCl, secondaryMarker->uniformsSize);
clInsertData(&primary->uniformsCl, secondaryMarker->uniformsSize, getCPAptrFromOffset(secondary->uniformsCl.CPA, secondaryMarker->uniformsBufOffset)); clInsertData(&primary->uniformsCl, secondaryMarker->uniformsSize, getCPAptrFromOffset(secondary->uniformsCl.CPA, secondaryMarker->uniformsBufOffset + secondary->uniformsCl.offset));
clFit(&primary->shaderRecCl, secondaryMarker->shaderRecSize); clFit(&primary->shaderRecCl, secondaryMarker->shaderRecSize);
clInsertData(&primary->shaderRecCl, secondaryMarker->shaderRecSize, getCPAptrFromOffset(secondary->shaderRecCl.CPA, secondaryMarker->shaderRecBufOffset)); clInsertData(&primary->shaderRecCl, secondaryMarker->shaderRecSize, getCPAptrFromOffset(secondary->shaderRecCl.CPA, secondaryMarker->shaderRecBufOffset + secondary->shaderRecCl.offset));
printf("\nUniforms: ");
for(int d = 0; d < secondaryMarker->uniformsSize / 4; ++d)
{
printf("%i ", *(((uint32_t*)getCPAptrFromOffset(secondary->uniformsCl.CPA, secondaryMarker->uniformsBufOffset + secondary->uniformsCl.offset))+d));
}
printf("\nUniforms: ");
for(int d = 0; d < secondaryMarker->uniformsSize / 4; ++d)
{
printf("%i ", *(((uint32_t*)getCPAptrFromOffset(primary->uniformsCl.CPA, primary->uniformsCl.offset))+d));
}
printf("\nBO handles: ");
for(int d = 0; d < secondaryMarker->handlesSize / 4; ++d)
{
printf("%u ", *(((uint32_t*)getCPAptrFromOffset(secondary->handlesCl.CPA, secondaryMarker->handlesBufOffset + secondary->handlesCl.offset))+d));
}
printf("\nBO handles: ");
for(int d = 0; d < secondaryMarker->handlesSize / 4; ++d)
{
printf("%u ", *(((uint32_t*)getCPAptrFromOffset(primary->handlesCl.CPA, primary->handlesCl.offset))+d));
}
primary->shaderRecCount += secondary->shaderRecCount; primary->shaderRecCount += secondary->shaderRecCount;
} }

View File

@ -379,6 +379,10 @@ typedef struct VkCommandBuffer_T
VkCommandBufferUsageFlags usageFlags; VkCommandBufferUsageFlags usageFlags;
_commandPool* cp; _commandPool* cp;
ControlList uniformRelocCl;
ControlList gemRelocCl;
ControlList shaderRecRelocCl;
//State data //State data
_pipeline* graphicsPipeline; _pipeline* graphicsPipeline;
_pipeline* computePipeline; _pipeline* computePipeline;

View File

@ -269,6 +269,17 @@ static uint32_t drawCommon(VkCommandBuffer commandBuffer, int32_t vertexOffset)
coordCode //coordinate shader code address coordCode //coordinate shader code address
); );
if(commandBuffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
{
uint32_t offset = commandBuffer->shaderRecCl.nextFreeByteOffset - commandBuffer->shaderRecCl.offset - 12;
clFit(&commandBuffer->shaderRecRelocCl, 12);
clInsertData(&commandBuffer->shaderRecRelocCl, 4, &offset);
offset -= 16;
clInsertData(&commandBuffer->shaderRecRelocCl, 4, &offset);
offset -= 16;
clInsertData(&commandBuffer->shaderRecRelocCl, 4, &offset);
}
uint32_t vertexAttribOffsets[8] = {}; uint32_t vertexAttribOffsets[8] = {};
uint32_t coordAttribOffsets[8] = {}; uint32_t coordAttribOffsets[8] = {};
for(uint32_t c = 1; c < 8; ++c) for(uint32_t c = 1; c < 8; ++c)
@ -330,6 +341,13 @@ static uint32_t drawCommon(VkCommandBuffer commandBuffer, int32_t vertexOffset)
vertexAttribOffsets[cb->graphicsPipeline->vertexAttributeDescriptions[c].location], //vertex vpm offset vertexAttribOffsets[cb->graphicsPipeline->vertexAttributeDescriptions[c].location], //vertex vpm offset
coordAttribOffsets[cb->graphicsPipeline->vertexAttributeDescriptions[c].location] //coordinte vpm offset coordAttribOffsets[cb->graphicsPipeline->vertexAttributeDescriptions[c].location] //coordinte vpm offset
); );
if(commandBuffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
{
uint32_t offset = commandBuffer->shaderRecCl.nextFreeByteOffset - commandBuffer->shaderRecCl.offset - 12;
clFit(&commandBuffer->shaderRecRelocCl, 4);
clInsertData(&commandBuffer->shaderRecRelocCl, 4, &offset);
}
} }
} }
@ -372,6 +390,13 @@ static uint32_t drawCommon(VkCommandBuffer commandBuffer, int32_t vertexOffset)
clFit(&commandBuffer->uniformsCl, 4); clFit(&commandBuffer->uniformsCl, 4);
clInsertData(&commandBuffer->uniformsCl, 4, &idx); clInsertData(&commandBuffer->uniformsCl, 4, &idx);
if(commandBuffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
{
uint32_t offset = commandBuffer->uniformsCl.nextFreeByteOffset - commandBuffer->uniformsCl.offset - 4;
clFit(&commandBuffer->uniformRelocCl, 4);
clInsertData(&commandBuffer->uniformRelocCl, 4, &offset);
}
numFragUniformReads++; numFragUniformReads++;
} }
else if(mapping.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER || else if(mapping.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER ||
@ -391,6 +416,13 @@ static uint32_t drawCommon(VkCommandBuffer commandBuffer, int32_t vertexOffset)
clFit(&commandBuffer->uniformsCl, 4); clFit(&commandBuffer->uniformsCl, 4);
clInsertData(&commandBuffer->uniformsCl, 4, &idx); clInsertData(&commandBuffer->uniformsCl, 4, &idx);
if(commandBuffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
{
uint32_t offset = commandBuffer->uniformsCl.nextFreeByteOffset - commandBuffer->uniformsCl.offset - 4;
clFit(&commandBuffer->uniformRelocCl, 4);
clInsertData(&commandBuffer->uniformRelocCl, 4, &offset);
}
numFragUniformReads++; numFragUniformReads++;
} }
else if(mapping.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER || else if(mapping.descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER ||
@ -408,6 +440,13 @@ static uint32_t drawCommon(VkCommandBuffer commandBuffer, int32_t vertexOffset)
clFit(&commandBuffer->uniformsCl, 4); clFit(&commandBuffer->uniformsCl, 4);
clInsertData(&commandBuffer->uniformsCl, 4, &idx); clInsertData(&commandBuffer->uniformsCl, 4, &idx);
if(commandBuffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
{
uint32_t offset = commandBuffer->uniformsCl.nextFreeByteOffset - commandBuffer->uniformsCl.offset - 4;
clFit(&commandBuffer->uniformRelocCl, 4);
clInsertData(&commandBuffer->uniformRelocCl, 4, &offset);
}
numFragUniformReads++; numFragUniformReads++;
} }
else else
@ -628,6 +667,13 @@ VKAPI_ATTR void VKAPI_CALL RPIFUNC(vkCmdDrawIndexed)(
clInsertGEMRelocations(&commandBuffer->binCl, idx, 0); clInsertGEMRelocations(&commandBuffer->binCl, idx, 0);
if(commandBuffer->level == VK_COMMAND_BUFFER_LEVEL_SECONDARY)
{
uint32_t offset = commandBuffer->binCl.nextFreeByteOffset - commandBuffer->binCl.offset - 8;
clFit(&commandBuffer->gemRelocCl, 4);
clInsertData(&commandBuffer->gemRelocCl, 4, &offset);
}
//Submit draw call: vertex Array Primitives //Submit draw call: vertex Array Primitives
clFit(&commandBuffer->binCl, V3D21_VERTEX_ARRAY_PRIMITIVES_length); clFit(&commandBuffer->binCl, V3D21_VERTEX_ARRAY_PRIMITIVES_length);