summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp
diff options
context:
space:
mode:
authorJules Blok <jules.blok@gmail.com>2015-05-04 23:28:30 +0200
committerJules Blok <jules.blok@gmail.com>2015-05-05 00:40:25 +0200
commit7a1252f7e51edcfd1f3505129d1f9aa68c5852c8 (patch)
tree0b73190fda407452a38d8ca27668c0c853535711 /Source/Core/VideoBackends/D3D/PixelShaderCache.cpp
parentf9dc8a39c0639c92f4850108e7cfa30e5e8420e2 (diff)
VideoBackends: Implement depth copy shaders with integer math.
Diffstat (limited to 'Source/Core/VideoBackends/D3D/PixelShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/PixelShaderCache.cpp58
1 files changed, 23 insertions, 35 deletions
diff --git a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp
index 045de131a1..e5b91660bf 100644
--- a/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp
+++ b/Source/Core/VideoBackends/D3D/PixelShaderCache.cpp
@@ -146,28 +146,21 @@ const char depth_matrix_program[] = {
" in float4 pos : SV_Position,\n"
" in float3 uv0 : TEXCOORD0){\n"
" float4 texcol = Tex0.Sample(samp0,uv0);\n"
+ " int depth = int(round(texcol.x * float(0xFFFFFF)));\n"
- // 255.99998474121 = 16777215/16777216*256
- " float workspace = texcol.x * 255.99998474121;\n"
+ // Convert to Z24 format
+ " int4 workspace;\n"
+ " workspace.r = (depth >> 16) & 255;\n"
+ " workspace.g = (depth >> 8) & 255;\n"
+ " workspace.b = depth & 255;\n"
- " texcol.x = floor(workspace);\n" // x component
+ // Convert to Z4 format
+ " workspace.a = (depth >> 16) & 0xF0;\n"
- " workspace = workspace - texcol.x;\n" // subtract x component out
- " workspace = workspace * 256.0;\n" // shift left 8 bits
- " texcol.y = floor(workspace);\n" // y component
-
- " workspace = workspace - texcol.y;\n" // subtract y component out
- " workspace = workspace * 256.0;\n" // shift left 8 bits
- " texcol.z = floor(workspace);\n" // z component
-
- " texcol.w = texcol.x;\n" // duplicate x into w
-
- " texcol = texcol / 255.0;\n" // normalize components to [0.0..1.0]
-
- " texcol.w = texcol.w * 15.0;\n"
- " texcol.w = floor(texcol.w);\n"
- " texcol.w = texcol.w / 15.0;\n" // w component
+ // Normalize components to [0.0..1.0]
+ " texcol = float4(workspace) / 255.0;\n"
+ // Apply color matrix
" ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n"
"}\n"
};
@@ -188,27 +181,22 @@ const char depth_matrix_program_msaa[] = {
" texcol += Tex0.Load(int3(uv0.x*(width), uv0.y*(height), uv0.z), i);\n"
" texcol /= SAMPLES;\n"
- // 255.99998474121 = 16777215/16777216*256
- " float workspace = texcol.x * 255.99998474121;\n"
-
- " texcol.x = floor(workspace);\n" // x component
-
- " workspace = workspace - texcol.x;\n" // subtract x component out
- " workspace = workspace * 256.0;\n" // shift left 8 bits
- " texcol.y = floor(workspace);\n" // y component
-
- " workspace = workspace - texcol.y;\n" // subtract y component out
- " workspace = workspace * 256.0;\n" // shift left 8 bits
- " texcol.z = floor(workspace);\n" // z component
+ " float4 texcol = Tex0.Sample(samp0,uv0);\n"
+ " int depth = int(round(texcol.x * float(0xFFFFFF)));\n"
- " texcol.w = texcol.x;\n" // duplicate x into w
+ // Convert to Z24 format
+ " int4 workspace;\n"
+ " workspace.r = (depth >> 16) & 255;\n"
+ " workspace.g = (depth >> 8) & 255;\n"
+ " workspace.b = depth & 255;\n"
- " texcol = texcol / 255.0;\n" // normalize components to [0.0..1.0]
+ // Convert to Z4 format
+ " workspace.a = (depth >> 16) & 0xF0;\n"
- " texcol.w = texcol.w * 15.0;\n"
- " texcol.w = floor(texcol.w);\n"
- " texcol.w = texcol.w / 15.0;\n" // w component
+ // Normalize components to [0.0..1.0]
+ " texcol = float4(workspace) / 255.0;\n"
+ // Apply color matrix
" ocol0 = float4(dot(texcol,cColMatrix[0]),dot(texcol,cColMatrix[1]),dot(texcol,cColMatrix[2]),dot(texcol,cColMatrix[3])) + cColMatrix[4];\n"
"}\n"
};