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