1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2025-01-18 10:52:14 +01:00

fixed clear test

This commit is contained in:
yours3lf 2020-05-10 19:03:36 +01:00
parent 3df04a2423
commit 3a16211893
3 changed files with 63 additions and 15 deletions

View File

@ -145,6 +145,7 @@ typedef struct VkDevice_T
VkShaderModule emulTextureToBufferShaderModule; //TODO
VkShaderModule emulBufferToBufferShaderModule; //TODO
VkShaderModule emulClearShaderModule;
VkShaderModule emulClearNoColorShaderModule;
} _device;
typedef struct VkRenderPass_T

View File

@ -6,7 +6,7 @@
#include "QPUassembler/qpu_assembler.h"
void createClearShaderModule(VkDevice device, VkShaderModule* blitShaderModule)
void createClearShaderModule(VkDevice device, VkShaderModule* blitShaderModule, VkShaderModule* blitShaderModuleNoColor)
{
char vs_asm_code[] =
///0x40000000 = 2.0
@ -118,10 +118,17 @@ void createClearShaderModule(VkDevice device, VkShaderModule* blitShaderModule)
"sig_unlock_score ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
"\0";
char* blit_asm_strings[] =
{
(char*)cs_asm_code, (char*)vs_asm_code, (char*)fs_asm_code, 0
};
char fs_asm_code_no_color[] =
"sig_none ; r0 = or.always(a, a, uni, nop) ; nop = nop(r0, r0) ;" //clear color value
"sig_none ; r1 = or.always(a, a, uni, nop) ; nop = nop(r0, r0) ;" //stencil setup
"sig_none ; r2 = or.always(a, a, uni, nop) ; nop = nop(r0, r0) ;" //depth clear value
"sig_none ; tlb_stencil_setup = or.always(r1, r1) ; nop = nop(r0, r0) ;"
"sig_none ; tlb_z = or.always(r2, r2) ; nop = nop(r0, r0) ;"
///"sig_none ; tlb_color_all = or.always(r0, r0) ; nop = nop(r0, r0) ;"
"sig_end ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
"sig_none ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
"sig_unlock_score ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
"\0";
VkRpiAssemblyMappingEXT vertexMappings[] = {
//vertex shader uniforms
@ -254,6 +261,20 @@ void createClearShaderModule(VkDevice device, VkShaderModule* blitShaderModule)
rpi_vkCreateShaderModule(device, &smci, 0, blitShaderModule);
assert(*blitShaderModule);
{ //assemble fs code
asm_sizes[2] = get_num_instructions(fs_asm_code_no_color);
uint32_t size = sizeof(uint64_t)*asm_sizes[2];
//TODO this alloc feels kinda useless, we just copy the data anyway to kernel space
//why not map kernel space mem to user space instead?
free(asm_ptrs[2]);
asm_ptrs[2] = (uint64_t*)malloc(size);
assemble_qpu_asm(fs_asm_code_no_color, asm_ptrs[2]);
assert(asm_ptrs[2]);
}
rpi_vkCreateShaderModule(device, &smci, 0, blitShaderModuleNoColor);
assert(*blitShaderModuleNoColor);
// _shaderModule* s = *blitShaderModule;
// fprintf(stderr, "=================\n");
// fprintf(stderr, "pixel shader bo %i\n", s->bos[2]);
@ -392,7 +413,7 @@ void setupClearEmulationResources(VkDevice device)
//create resources that won't change
_device* dev = device;
createClearShaderModule(device, &dev->emulClearShaderModule);
createClearShaderModule(device, &dev->emulClearShaderModule, &dev->emulClearNoColorShaderModule);
createClearDescriptorSetLayouts(device, &dev->emulClearDsl);
}
@ -576,6 +597,19 @@ VKAPI_ATTR void VKAPI_CALL rpi_vkCmdClearAttachments(
return;
}
_pipeline* oldPipeline;
uint32_t oldVertexBufferOffsets[8];
_buffer* oldVertexBuffers[8];
char oldPushConstantBufferVertex[256];
char oldPushConstantBufferPixel[256];
//save the state that we'll modify
oldPipeline = cmdBuf->graphicsPipeline;
memcpy(oldVertexBufferOffsets, cmdBuf->vertexBufferOffsets, sizeof(oldVertexBufferOffsets));
memcpy(oldVertexBuffers, cmdBuf->vertexBuffers, sizeof(oldVertexBuffers));
memcpy(oldPushConstantBufferVertex, cmdBuf->pushConstantBufferVertex, sizeof(oldPushConstantBufferVertex));
memcpy(oldPushConstantBufferPixel, cmdBuf->pushConstantBufferPixel, sizeof(oldPushConstantBufferPixel));
for(uint32_t c = 0; c < attachmentCount; ++c)
{
uint32_t clearColor = 0, clearDepth = 0, clearStencil = 0;
@ -613,7 +647,7 @@ VKAPI_ATTR void VKAPI_CALL rpi_vkCmdClearAttachments(
dsci.front.passOp = VK_STENCIL_OP_REPLACE;
dsci.back = dsci.front;
createClearPipeline(device, &dsci, device->emulClearShaderModule, device->emulClearDsl, &blitPipelineLayout, cmdBuf->currRenderPass, &blitPipeline);
createClearPipeline(device, &dsci, clearColor ? device->emulClearShaderModule : device->emulClearNoColorShaderModule, device->emulClearDsl, &blitPipelineLayout, cmdBuf->currRenderPass, &blitPipeline);
// _shaderModule* s = device->emulClearShaderModule;
// fprintf(stderr, "=================\n");
@ -629,7 +663,7 @@ VKAPI_ATTR void VKAPI_CALL rpi_vkCmdClearAttachments(
uint32_t clearColorValue = 0, stencilSetup = 0, depthClearValue = 0;
clearColorValue = packVec4IntoABGR8(&pAttachments[c].clearValue.color.float32[0]);
depthClearValue = (uint32_t)(pAttachments[c].clearValue.depthStencil.depth * 0xffffff) & 0xffffff;
depthClearValue = (uint32_t)(pAttachments[c].clearValue.depthStencil.depth * 0xffffffu) & 0xffffffu;
uint32_t numValues = 1;
encodeStencilValue(&stencilSetup, &numValues, dsci.front, dsci.back, clearStencil);
@ -673,6 +707,13 @@ VKAPI_ATTR void VKAPI_CALL rpi_vkCmdClearAttachments(
rpi_vkDestroyPipelineLayout(device, blitPipelineLayout, 0);
rpi_vkDestroyPipeline(device, blitPipeline, 0);
}
//restore state
cmdBuf->graphicsPipeline = oldPipeline;
memcpy(cmdBuf->vertexBufferOffsets, oldVertexBufferOffsets, sizeof(oldVertexBufferOffsets));
memcpy(cmdBuf->vertexBuffers, oldVertexBuffers, sizeof(oldVertexBuffers));
memcpy(cmdBuf->pushConstantBufferVertex, oldPushConstantBufferVertex, sizeof(oldPushConstantBufferVertex));
memcpy(cmdBuf->pushConstantBufferPixel, oldPushConstantBufferPixel, sizeof(oldPushConstantBufferPixel));
}
/*

View File

@ -825,19 +825,25 @@ void recordCommandBuffers()
uint32_t fragColor = 0xffa14ccc; //purple
vkCmdPushConstants(presentCommandBuffers[i], pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(fragColor), &fragColor);
VkDeviceSize offsets = 0;
vkCmdBindVertexBuffers(presentCommandBuffers[i], 0, 1, &vertexBuffer1, &offsets );
vkCmdDraw(presentCommandBuffers[i], 3, 1, 0, 0);
VkClearAttachment clearAttachment[2] = {};
clearAttachment[0].aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
clearAttachment[0].clearValue.depthStencil.depth = 0.3f;
VkClearAttachment clearAttachment = {};
clearAttachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
clearAttachment.clearValue.depthStencil.depth = 0.0f;
clearAttachment[1].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
clearAttachment[1].clearValue.color.float32[0] = 1.0f;
clearAttachment[1].clearValue.color.float32[1] = 1.0f;
clearAttachment[1].clearValue.color.float32[2] = 1.0f;
clearAttachment[1].clearValue.color.float32[3] = 1.0f;
VkClearRect clearRect = {};
clearRect.rect.offset.x = 0;
clearRect.rect.offset.y = 0;
clearRect.rect.extent.width = swapChainExtent.width;
clearRect.rect.extent.height = swapChainExtent.height;
vkCmdClearAttachments(presentCommandBuffers[i], 1, &clearAttachment, 1, &clearRect);
vkCmdClearAttachments(presentCommandBuffers[i], 2, clearAttachment, 1, &clearRect);
VkDeviceSize offsets = 0;
vkCmdBindVertexBuffers(presentCommandBuffers[i], 0, 1, &vertexBuffer1, &offsets );
vkCmdDraw(presentCommandBuffers[i], 3, 1, 0, 0);
fragColor = 0xffafcd02; //yellow
vkCmdPushConstants(presentCommandBuffers[i], pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(fragColor), &fragColor);