Browse Source

GPU: Fix and generalize BytesPerRow() and BytesPerImage() (#10663)

These functions had special cases for a few BC formats, but all
block-compressed formats should need the same logic. Furthermore they
weren't handling the sRGB variants of those formats.
Andrei Alexeyev 7 tháng trước cách đây
mục cha
commit
d4b8072614
1 tập tin đã thay đổi với 6 bổ sung15 xóa
  1. 6 15
      src/gpu/SDL_sysgpu.h

+ 6 - 15
src/gpu/SDL_sysgpu.h

@@ -173,14 +173,9 @@ static inline Uint32 BytesPerRow(
     SDL_GPUTextureFormat format)
 {
     Uint32 blocksPerRow = width;
+    Uint32 pixelRowsPerBlock = Texture_GetBlockSize(format);
 
-    if (format == SDL_GPU_TEXTUREFORMAT_BC1_UNORM ||
-        format == SDL_GPU_TEXTUREFORMAT_BC2_UNORM ||
-        format == SDL_GPU_TEXTUREFORMAT_BC3_UNORM ||
-        format == SDL_GPU_TEXTUREFORMAT_BC7_UNORM) {
-        blocksPerRow = (width + 3) / 4;
-    }
-
+    blocksPerRow = (width + pixelRowsPerBlock - 1) / pixelRowsPerBlock;
     return blocksPerRow * SDL_GPUTextureFormatTexelBlockSize(format);
 }
 
@@ -191,15 +186,11 @@ static inline Sint32 BytesPerImage(
 {
     Uint32 blocksPerRow = width;
     Uint32 blocksPerColumn = height;
+    Uint32 pixelRowsPerBlock = Texture_GetBlockSize(format);
+    Uint32 pixelColumnsPerBlock = pixelRowsPerBlock;
 
-    if (format == SDL_GPU_TEXTUREFORMAT_BC1_UNORM ||
-        format == SDL_GPU_TEXTUREFORMAT_BC2_UNORM ||
-        format == SDL_GPU_TEXTUREFORMAT_BC3_UNORM ||
-        format == SDL_GPU_TEXTUREFORMAT_BC7_UNORM) {
-        blocksPerRow = (width + 3) / 4;
-        blocksPerColumn = (height + 3) / 4;
-    }
-
+    blocksPerRow = (width + pixelRowsPerBlock - 1) / pixelRowsPerBlock;
+    blocksPerColumn = (height + pixelColumnsPerBlock - 1) / pixelColumnsPerBlock;
     return blocksPerRow * blocksPerColumn * SDL_GPUTextureFormatTexelBlockSize(format);
 }