diff options
| author | magumagu <magumagu9@gmail.com> | 2015-01-25 19:48:29 -0800 |
|---|---|---|
| committer | magumagu <magumagu9@gmail.com> | 2015-01-25 19:57:09 -0800 |
| commit | b0b99b69229c1c76c6eca51583a47090bd2e383c (patch) | |
| tree | c5301b04fba10ffe467f9976a4df9df321837bf4 /Source/Core/VideoCommon/TextureConversionShader.cpp | |
| parent | 6c1bdfe04cd12cbc75c86d6b71472393443426a5 (diff) | |
Fix shader so it's possible to use with D3D Map().
Well, that's not strictly true, but trying to memcpy between two buffers
using different row lengths and different strides is at minimum extremely
unintuitive.
Diffstat (limited to 'Source/Core/VideoCommon/TextureConversionShader.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/TextureConversionShader.cpp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/Source/Core/VideoCommon/TextureConversionShader.cpp b/Source/Core/VideoCommon/TextureConversionShader.cpp index e7600d6248..ebb3b065fd 100644 --- a/Source/Core/VideoCommon/TextureConversionShader.cpp +++ b/Source/Core/VideoCommon/TextureConversionShader.cpp @@ -88,21 +88,19 @@ static void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType) ); } - WRITE(p, " int y_block_position = uv1.y & %d;\n", ~(blkH - 1)); - WRITE(p, " int y_offset_in_block = uv1.y & %d;\n", blkH - 1); - WRITE(p, " int x_virtual_position = (uv1.x << %d) + y_offset_in_block * position.z;\n", IntLog2(samples)); - WRITE(p, " int x_block_position = (x_virtual_position >> %d) & %d;\n", IntLog2(blkH), ~(blkW - 1)); + WRITE(p, " int x_block_position = (uv1.x >> %d) << %d;\n", IntLog2(blkH * blkW / samples), IntLog2(blkW)); + WRITE(p, " int y_block_position = uv1.y << %d;\n", IntLog2(blkH)); + WRITE(p, " int offset_in_block = uv1.x & %d;\n", (blkH * blkW / samples) - 1); + WRITE(p, " int y_offset_in_block = offset_in_block >> %d;\n", IntLog2(blkW / samples)); + WRITE(p, " int x_offset_in_block = (offset_in_block & %d) << %d;\n", (blkW / samples) - 1, IntLog2(samples)); if (samples == 1) { - // 32 bit textures (RGBA8 and Z24) are stored in 2 cache line increments - WRITE(p, " bool first = 0 == (x_virtual_position & %d);\n", 8 * samples); // first cache line, used in the encoders - WRITE(p, " x_virtual_position = x_virtual_position << 1;\n"); + WRITE(p, " bool first = 0 == (x_block_position & %d);\n", blkW); + WRITE(p, " x_block_position >>= 1;\n", blkW); } - WRITE(p, " int x_offset_in_block = x_virtual_position & %d;\n", blkW - 1); - WRITE(p, " int y_offset = (x_virtual_position >> %d) & %d;\n", IntLog2(blkW), blkH - 1); - WRITE(p, " sampleUv.x = x_offset_in_block + x_block_position;\n"); - WRITE(p, " sampleUv.y = y_block_position + y_offset;\n"); + WRITE(p, " sampleUv.x = x_block_position + x_offset_in_block;\n"); + WRITE(p, " sampleUv.y = y_block_position + y_offset_in_block;\n"); WRITE(p, " float2 uv0 = float2(sampleUv);\n"); // sampleUv is the sample position in (int)gx_coords WRITE(p, " uv0 += float2(0.5, 0.5);\n"); // move to center of pixel |
