Use the _xe suffix instead of the xesl_ prefix for quicker visual recognition of identifiers, also switch to snake_case for consistency. Also add the f suffix to float32 literals because the Metal Shading Language is based on C++.
87 lines
3.3 KiB
Plaintext
87 lines
3.3 KiB
Plaintext
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2022 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#include "../../ui/shaders/xesl.xesli"
|
|
|
|
#ifdef XE_APPLY_GAMMA_COMPUTE
|
|
#ifdef XE_APPLY_GAMMA_FXAA_LUMA
|
|
#define XE_APPLY_GAMMA_DEST_FORMAT image_format_rgba16f_xe
|
|
#else
|
|
#define XE_APPLY_GAMMA_DEST_FORMAT image_format_rgb10_a2_xe
|
|
#endif
|
|
push_const_begin_xe(b0, space0)
|
|
uint2_xe xe_apply_gamma_size;
|
|
push_const_end_xe
|
|
#define LOCAL_SIZE_X_XE 16
|
|
#define LOCAL_SIZE_Y_XE 8
|
|
#define LOCAL_SIZE_Z_XE 1
|
|
entry_bindings_begin_compute_xe
|
|
push_const_binding_xe(buffer(0))
|
|
entry_binding_next_xe
|
|
texture_xe(texture_buffer_xe, xe_apply_gamma_ramp, set=0, binding=0, t0,
|
|
space0, texture(0))
|
|
entry_binding_next_xe
|
|
texture_xe(texture_2d_xe, xe_apply_gamma_source, set=1, binding=0, t1,
|
|
space0, texture(1))
|
|
entry_binding_next_xe
|
|
image_wo_xe(image_2d_xe, XE_APPLY_GAMMA_DEST_FORMAT, xe_apply_gamma_dest,
|
|
set=2, binding=0, u0, space0, texture(2))
|
|
entry_bindings_end_inputs_begin_compute_xe
|
|
entry_in_global_thread_id_xe
|
|
entry_inputs_end_code_begin_compute_xe
|
|
uint2_xe pixel_index = in_global_thread_id_xe.xy;
|
|
dont_flatten_xe
|
|
if (any(greater_than_equal_xe(pixel_index,
|
|
push_const_xe(xe_apply_gamma_size)))) {
|
|
return;
|
|
}
|
|
#else
|
|
entry_outputs_begin_xe
|
|
entry_out_target_xe(float4_xe, xe_apply_gamma_dest, 0)
|
|
entry_outputs_end_stage_inputs_begin_xe
|
|
entry_stage_inputs_end_bindings_begin_pixel_xe
|
|
texture_xe(texture_buffer_xe, xe_apply_gamma_ramp, set=0, binding=0, t0,
|
|
space0, texture(0))
|
|
entry_binding_next_xe
|
|
texture_xe(texture_2d_xe, xe_apply_gamma_source, set=1, binding=0, t1,
|
|
space0, texture(1))
|
|
entry_bindings_end_inputs_begin_xe
|
|
entry_in_pixel_coord_xe
|
|
entry_inputs_end_code_begin_xe
|
|
uint2_xe pixel_index = uint2_xe(in_pixel_coord_xe.xy);
|
|
#endif // XE_APPLY_GAMMA_COMPUTE
|
|
// UNORM conversion according to the Direct3D 10+ rules.
|
|
uint3_xe apply_gamma_input = uint3_xe(
|
|
texel_fetch_2d_xe(xe_apply_gamma_source, pixel_index, 0).rgb * 255.0f +
|
|
0.5f);
|
|
// The ramp has blue in bits 0:9, green in 10:19, red in 20:29 - BGR passed as
|
|
// an R10G10B10A2 buffer.
|
|
float4_xe apply_gamma_output;
|
|
apply_gamma_output.r =
|
|
texel_fetch_buffer_xe(xe_apply_gamma_ramp, apply_gamma_input.r).b;
|
|
apply_gamma_output.g =
|
|
texel_fetch_buffer_xe(xe_apply_gamma_ramp, apply_gamma_input.g).g;
|
|
apply_gamma_output.b =
|
|
texel_fetch_buffer_xe(xe_apply_gamma_ramp, apply_gamma_input.b).r;
|
|
#ifdef XE_APPLY_GAMMA_FXAA_LUMA
|
|
// Perceptual luma.
|
|
apply_gamma_output.a =
|
|
dot(apply_gamma_output.rgb, float3_xe(0.299f, 0.587f, 0.114f));
|
|
#else
|
|
// Perceptual luma.
|
|
apply_gamma_output.a = 1.0f;
|
|
#endif
|
|
#ifdef XE_APPLY_GAMMA_COMPUTE
|
|
image_store_2d_rgba_xe(xe_apply_gamma_dest, pixel_index, apply_gamma_output);
|
|
entry_code_end_compute_xe
|
|
#else
|
|
out_xe(xe_apply_gamma_dest) = apply_gamma_output;
|
|
entry_code_end_xe
|
|
#endif
|