1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2024-12-01 13:24:20 +01:00

fixed blit code, now just need to put it into vkcmdcopybuffertoimage

This commit is contained in:
Unknown 2019-08-26 20:16:26 +01:00
parent df8e7d089b
commit 0f082b8130

View File

@ -87,6 +87,64 @@ VkBufferView texelBufferView;
uint32_t graphicsQueueFamily;
uint32_t presentQueueFamily;
char* readPPM(const char* fileName)
{
uint16_t ppm_magic;
((uint8_t*)&ppm_magic)[0] = 'P';
((uint8_t*)&ppm_magic)[1] = '6';
FILE* fd = fopen(fileName, "rb");
fseek (fd , 0 , SEEK_END);
uint32_t fsize = ftell(fd);
rewind(fd);
char* buf = (char*)malloc(fsize);
if(!buf)
{
return 0;
}
fread(buf, 1, fsize, fd);
fclose(fd);
uint16_t magic_number = ((uint16_t*)buf)[0];
if(magic_number != ppm_magic)
{
printf("PPM magic number not found: %u\n", magic_number);
return 0;
}
char* widthStr = strtok(buf+3, " ");
char* heightStr = strtok(0, "\n");
char* maxValStr = strtok(0, "\n");
int width = atoi(widthStr);
int height = atoi(heightStr);
int maxVal = atoi(maxValStr);
printf("Image size: %i x %i\n", width, height);
printf("Max value: %i\n", maxVal);
char* imageBuf = maxValStr + strlen(maxValStr) + 1;
//convert to BGRA (A=1)
char* retBuf = (char*)malloc(width * height * 4);
for(int y = 0; y < height; ++y)
{
for(int x = 0; x < width; ++x)
{
retBuf[(y*width+x)*4+0] = imageBuf[(y*width+x)*3+2];
retBuf[(y*width+x)*4+1] = imageBuf[(y*width+x)*3+1];
retBuf[(y*width+x)*4+2] = imageBuf[(y*width+x)*3+0];
retBuf[(y*width+x)*4+3] = 0xff;
}
}
free(buf);
return retBuf;
}
void cleanup() {
vkDeviceWaitIdle(device);
@ -679,7 +737,7 @@ void recordCommandBuffers()
fragConstants[0] = size;
fragConstants[1] = 0;
vkCmdPushConstants(presentCommandBuffers[i], pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(vertConstants), &fragConstants);
vkCmdPushConstants(presentCommandBuffers[i], pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(fragConstants), &fragConstants);
vkCmdDraw(presentCommandBuffers[i], 3, 1, 0, 0);
@ -948,7 +1006,7 @@ void CreateShaders()
///second argument must be a uniform (containing base address, which is 0)
///writing tmu0_s signals that all coordinates are written
"sig_small_imm ; r0 = max.always(r0, b, nop, 0) ; nop = nop(r0, r0) ;" //clamp general access
"sig_none ; r0 = min.always(r0, b, nop, uni) ; nop = nop(r0, r0) ;" //uni = 1920 * 1080 * 4
"sig_none ; r0 = min.always(r0, b, nop, uni) ; nop = nop(r0, r0) ;" //uni = 1920 * 1080 * 4 - 4
"sig_none ; tmu0_s = add.always(r0, b, nop, uni) ; nop = nop(r0, r0) ;"
///suspend thread (after 2 nops) to wait for TMU request to finish
"sig_thread_switch ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
@ -1193,14 +1251,7 @@ void CreateTexture()
uint32_t width = swapChainExtent.width, height = swapChainExtent.height;
uint32_t mipLevels = 1;
char* texData = (char*)malloc(width * height * 4);
for(int y = 0; y < height; ++y)
{
for(int x = 0; x < width; ++x)
{
*(uint32_t*)(texData + (y * width + x) * 4) = 0xffffffff;
}
}
char* texData = readPPM("image.ppm");
{ //create storage texel buffer for generic mem address TMU ops test
VkBufferCreateInfo bufferCreateInfo = {};
@ -1223,7 +1274,7 @@ void CreateTexture()
void* data;
vkMapMemory(device, texelBufferMemory, 0, mr.size, 0, &data);
memcpy(data, texData, sizeof(texData));
memcpy(data, texData, width * height * 4);
vkUnmapMemory(device, texelBufferMemory);
free(texData);