From ed94d1586bd4841c94eb092b4e48fbc24a7fa71d Mon Sep 17 00:00:00 2001 From: yours3lf <0.tamas.marton@gmail.com> Date: Fri, 15 May 2020 18:58:21 +0100 Subject: [PATCH] fixed render target T/LT mode setting --- driver/command.c | 24 ++++++++++++------------ driver/common.c | 7 +++++++ driver/common.h | 1 + driver/resource.c | 7 ++----- test/mipmapping/mipmapping.cpp | 5 ++++- 5 files changed, 26 insertions(+), 18 deletions(-) diff --git a/driver/command.c b/driver/command.c index 25029b8..6e13055 100644 --- a/driver/command.c +++ b/driver/command.c @@ -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; } diff --git a/driver/common.c b/driver/common.c index d8ef1ae..bd439a3 100644 --- a/driver/common.c +++ b/driver/common.c @@ -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. diff --git a/driver/common.h b/driver/common.h index f996584..c53bd18 100644 --- a/driver/common.h +++ b/driver/common.h @@ -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); diff --git a/driver/resource.c b/driver/resource.c index 86ae538..18e868d 100644 --- a/driver/resource.c +++ b/driver/resource.c @@ -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; diff --git a/test/mipmapping/mipmapping.cpp b/test/mipmapping/mipmapping.cpp index 149d232..6704312 100644 --- a/test/mipmapping/mipmapping.cpp +++ b/test/mipmapping/mipmapping.cpp @@ -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;