9 changed files with 4 additions and 272 deletions
-
6src/video_core/host_shaders/CMakeLists.txt
-
46src/video_core/host_shaders/convert_abgr8_srgb_to_d24s8.frag
-
28src/video_core/host_shaders/convert_astc_hdr_to_rgba16f.comp
-
29src/video_core/host_shaders/convert_bc7_to_rgba8.comp
-
31src/video_core/host_shaders/convert_rgba16f_to_rgba8.frag
-
30src/video_core/host_shaders/convert_yuv420_to_rgb.comp
-
67src/video_core/renderer_vulkan/blit_image.cpp
-
19src/video_core/renderer_vulkan/blit_image.h
-
20src/video_core/renderer_vulkan/vk_texture_cache.cpp
@ -1,46 +0,0 @@ |
|||||
// SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
|
||||
#version 450 |
|
||||
#extension GL_ARB_shader_stencil_export : require |
|
||||
|
|
||||
layout(binding = 0) uniform sampler2D color_texture; |
|
||||
|
|
||||
// Even more accurate sRGB to linear conversion |
|
||||
// https://entropymine.com/imageworsener/srgbformula/ |
|
||||
float srgbToLinear(float srgb) { |
|
||||
if (srgb <= 0.0404482362771082f) { //assumes it's >= 0 |
|
||||
return srgb / 12.92; |
|
||||
} else { |
|
||||
return pow((srgb + 0.055) / 1.055, 2.4); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void main() { |
|
||||
ivec2 coord = ivec2(gl_FragCoord.xy); |
|
||||
vec4 srgbColor = texelFetch(color_texture, coord, 0); |
|
||||
|
|
||||
// Convert sRGB to linear space with proper gamma correction |
|
||||
vec3 linearColor = vec3( |
|
||||
srgbToLinear(srgbColor.r), |
|
||||
srgbToLinear(srgbColor.g), |
|
||||
srgbToLinear(srgbColor.b) |
|
||||
); |
|
||||
|
|
||||
// Use standard luminance coefficients |
|
||||
float luminance = dot(linearColor, vec3(0.2126, 0.7152, 0.0722)); |
|
||||
|
|
||||
// Ensure proper depth range |
|
||||
luminance = clamp(luminance, 0.0, 1.0); |
|
||||
|
|
||||
// Convert to 24-bit depth value |
|
||||
uint depth_val = uint(luminance * float(0xFFFFFF)); |
|
||||
|
|
||||
// Extract 8-bit stencil from alpha |
|
||||
uint stencil_val = uint(srgbColor.a * 255.0); |
|
||||
|
|
||||
// Pack values efficiently |
|
||||
uint depth_stencil = (stencil_val << 24) | (depth_val & 0x00FFFFFF); |
|
||||
|
|
||||
gl_FragDepth = float(depth_val) / float(0xFFFFFF); |
|
||||
gl_FragStencilRefARB = int(stencil_val); |
|
||||
} |
|
||||
@ -1,28 +0,0 @@ |
|||||
#version 450 |
|
||||
|
|
||||
layout(local_size_x = 8, local_size_y = 8) in; |
|
||||
|
|
||||
layout(binding = 0) uniform samplerBuffer astc_data; |
|
||||
layout(binding = 1, rgba16f) uniform writeonly image2D output_image; |
|
||||
|
|
||||
// Note: This is a simplified version. Real ASTC HDR decompression is more complex |
|
||||
void main() { |
|
||||
ivec2 pos = ivec2(gl_GlobalInvocationID.xy); |
|
||||
ivec2 size = imageSize(output_image); |
|
||||
|
|
||||
if (pos.x >= size.x || pos.y >= size.y) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
// Calculate block and pixel within block |
|
||||
ivec2 block = pos / 8; // Assuming 8x8 ASTC blocks |
|
||||
ivec2 pixel = pos % 8; |
|
||||
|
|
||||
// Each ASTC block is 16 bytes |
|
||||
int block_index = block.y * (size.x / 8) + block.x; |
|
||||
|
|
||||
// Simplified ASTC HDR decoding - you'll need to implement full ASTC decoding |
|
||||
vec4 color = texelFetch(astc_data, block_index * 8 + pixel.y * 8 + pixel.x); |
|
||||
|
|
||||
imageStore(output_image, pos, color); |
|
||||
} |
|
||||
@ -1,29 +0,0 @@ |
|||||
#version 450 |
|
||||
#extension GL_ARB_shader_ballot : require |
|
||||
|
|
||||
layout(local_size_x = 8, local_size_y = 8) in; |
|
||||
|
|
||||
layout(binding = 0) uniform samplerBuffer bc7_data; |
|
||||
layout(binding = 1, rgba8) uniform writeonly image2D output_image; |
|
||||
|
|
||||
// Note: This is a simplified version. Real BC7 decompression is more complex |
|
||||
void main() { |
|
||||
ivec2 pos = ivec2(gl_GlobalInvocationID.xy); |
|
||||
ivec2 size = imageSize(output_image); |
|
||||
|
|
||||
if (pos.x >= size.x || pos.y >= size.y) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
// Calculate block and pixel within block |
|
||||
ivec2 block = pos / 4; |
|
||||
ivec2 pixel = pos % 4; |
|
||||
|
|
||||
// Each BC7 block is 16 bytes |
|
||||
int block_index = block.y * (size.x / 4) + block.x; |
|
||||
|
|
||||
// Simplified BC7 decoding - you'll need to implement full BC7 decoding |
|
||||
vec4 color = texelFetch(bc7_data, block_index * 4 + pixel.y * 4 + pixel.x); |
|
||||
|
|
||||
imageStore(output_image, pos, color); |
|
||||
} |
|
||||
@ -1,31 +0,0 @@ |
|||||
#version 450 |
|
||||
|
|
||||
layout(location = 0) in vec2 texcoord; |
|
||||
layout(location = 0) out vec4 color; |
|
||||
|
|
||||
layout(binding = 0) uniform sampler2D input_texture; |
|
||||
|
|
||||
layout(push_constant) uniform PushConstants { |
|
||||
float exposure; |
|
||||
float gamma; |
|
||||
} constants; |
|
||||
|
|
||||
vec3 tonemap(vec3 hdr) { |
|
||||
// Reinhard tonemapping |
|
||||
return hdr / (hdr + vec3(1.0)); |
|
||||
} |
|
||||
|
|
||||
void main() { |
|
||||
vec4 hdr = texture(input_texture, texcoord); |
|
||||
|
|
||||
// Apply exposure |
|
||||
vec3 exposed = hdr.rgb * constants.exposure; |
|
||||
|
|
||||
// Tonemap |
|
||||
vec3 tonemapped = tonemap(exposed); |
|
||||
|
|
||||
// Gamma correction |
|
||||
vec3 gamma_corrected = pow(tonemapped, vec3(1.0 / constants.gamma)); |
|
||||
|
|
||||
color = vec4(gamma_corrected, hdr.a); |
|
||||
} |
|
||||
@ -1,30 +0,0 @@ |
|||||
#version 450 |
|
||||
|
|
||||
layout(local_size_x = 8, local_size_y = 8) in; |
|
||||
|
|
||||
layout(binding = 0) uniform sampler2D y_texture; |
|
||||
layout(binding = 1) uniform sampler2D u_texture; |
|
||||
layout(binding = 2) uniform sampler2D v_texture; |
|
||||
layout(binding = 3, rgba8) uniform writeonly image2D output_image; |
|
||||
|
|
||||
void main() { |
|
||||
ivec2 pos = ivec2(gl_GlobalInvocationID.xy); |
|
||||
ivec2 size = imageSize(output_image); |
|
||||
|
|
||||
if (pos.x >= size.x || pos.y >= size.y) { |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
vec2 tex_coord = vec2(pos) / vec2(size); |
|
||||
float y = texture(y_texture, tex_coord).r; |
|
||||
float u = texture(u_texture, tex_coord).r - 0.5; |
|
||||
float v = texture(v_texture, tex_coord).r - 0.5; |
|
||||
|
|
||||
// YUV to RGB conversion |
|
||||
vec3 rgb; |
|
||||
rgb.r = y + 1.402 * v; |
|
||||
rgb.g = y - 0.344 * u - 0.714 * v; |
|
||||
rgb.b = y + 1.772 * u; |
|
||||
|
|
||||
imageStore(output_image, pos, vec4(rgb, 1.0)); |
|
||||
} |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue