1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2025-03-21 12:29:15 +01:00

fixed render target T/LT mode setting

This commit is contained in:
yours3lf 2020-05-15 18:58:21 +01:00
parent 1e681e8292
commit ed94d1586b
5 changed files with 26 additions and 18 deletions

View File

@ -358,11 +358,11 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkQueueSubmit(
//fill out submit cl fields
if(writeImage)
{
uint32_t nonPaddedSize = (marker->width * marker->height * getFormatBpp(writeImage->format)) >> 3;
uint32_t tiling = writeImage->tiling;
if(writeImage->tiling == VC4_TILING_FORMAT_T && nonPaddedSize < 4096)
uint32_t isLT = isLTformat(getFormatBpp(writeImage->format), marker->width, marker->height);
if(writeImage->tiling == VC4_TILING_FORMAT_T && isLT)
{
tiling = VC4_TILING_FORMAT_LT;
}
@ -390,11 +390,11 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkQueueSubmit(
if(readImage)
{
uint32_t nonPaddedSize = (marker->width * marker->height * getFormatBpp(readImage->format)) >> 3;
uint32_t tiling = readImage->tiling;
if(readImage->tiling == VC4_TILING_FORMAT_T && nonPaddedSize < 4096)
uint32_t isLT = isLTformat(getFormatBpp(readImage->format), marker->width, marker->height);
if(readImage->tiling == VC4_TILING_FORMAT_T && isLT)
{
tiling = VC4_TILING_FORMAT_LT;
}
@ -408,11 +408,11 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkQueueSubmit(
if(writeDepthStencilImage)
{
uint32_t nonPaddedSize = (marker->width * marker->height * getFormatBpp(writeDepthStencilImage->format)) >> 3;
uint32_t tiling = writeDepthStencilImage->tiling;
if(writeDepthStencilImage->tiling == VC4_TILING_FORMAT_T && nonPaddedSize < 4096)
uint32_t isLT = isLTformat(getFormatBpp(writeDepthStencilImage->format), marker->width, marker->height);
if(writeDepthStencilImage->tiling == VC4_TILING_FORMAT_T && isLT)
{
tiling = VC4_TILING_FORMAT_LT;
}
@ -434,11 +434,11 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkQueueSubmit(
if(readDepthStencilImage)
{
uint32_t nonPaddedSize = (marker->width * marker->height * getFormatBpp(readDepthStencilImage->format)) >> 3;
uint32_t tiling = readDepthStencilImage->tiling;
if(readDepthStencilImage->tiling == VC4_TILING_FORMAT_T && nonPaddedSize < 4096)
uint32_t isLT = isLTformat(getFormatBpp(readDepthStencilImage->format), marker->width, marker->height);
if(readDepthStencilImage->tiling == VC4_TILING_FORMAT_T && isLT)
{
tiling = VC4_TILING_FORMAT_LT;
}

View File

@ -206,6 +206,13 @@ int findDeviceExtension(char* name)
return -1;
}
uint32_t isLTformat(uint32_t bpp, uint32_t width, uint32_t height)
{
uint32_t utileW, utileH;
getUTileDimensions(bpp, &utileW, &utileH);
return (width <= 4 * utileW || height <= utileH);
}
//Textures in T format:
//formed out of 4KB tiles, which have 1KB subtiles (see page 105 in VC4 arch guide)
//1KB subtiles have 512b microtiles.

View File

@ -546,6 +546,7 @@ uint32_t packVec4IntoABGR8(const float rgba[4]);
void createImageBO(_image* i);
int findInstanceExtension(char* name);
int findDeviceExtension(char* name);
uint32_t isLTformat(uint32_t bpp, uint32_t width, uint32_t height);
void getUTileDimensions(uint32_t bpp, uint32_t* tileW, uint32_t* tileH);
uint32_t roundUp(uint32_t numToRound, uint32_t multiple);
int isDepthStencilFormat(VkFormat format);

View File

@ -211,7 +211,6 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkCreateImage(
i->usageBits = pCreateInfo->usage;
i->format = pCreateInfo->format;
i->imageSpace = 0;
uint32_t nonPaddedSize = (i->width * i->height * getFormatBpp(i->format)) >> 3;
i->tiling = 0;
if(pCreateInfo->tiling == VK_IMAGE_TILING_LINEAR)
{
@ -219,7 +218,8 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkCreateImage(
}
else
{
if(nonPaddedSize >= 4096)
uint32_t isLT = isLTformat(getFormatBpp(i->format), i->width, i->height);
if(!isLT)
{
i->tiling = VC4_TILING_FORMAT_T;
}
@ -432,9 +432,6 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkBindImageMemory(
assert(memoryOffset % i->alignment == 0);
assert(i->size <= m->size - memoryOffset);
//image memory must be aligned to 4096 bytes
//assert((memoryOffset % 4096) == 0);
i->boundMem = m;
i->boundOffset = memoryOffset;

View File

@ -770,7 +770,10 @@ void recordCommandBuffers()
vkCmdPushConstants(presentCommandBuffers[i], samplePipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(pushConstants), &pushConstants);
float mipBias = 0.0f;
//TODO some miplevels are small enough to fall
//into LT sizes (eg. < 4096bytes overall)
//and that doesn't work for some reason
float mipBias = 6.0f;
uint32_t fragPushConstants[1];
fragPushConstants[0] = *(uint32_t*)&mipBias;