summaryrefslogtreecommitdiffstats
path: root/src/video_core/host_shaders/convert_d24s8_to_b10g11r11.frag
blob: c2d935fcd97b8443e271132333a277b576166f1f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Copyright 2021 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

#version 450

layout(binding = 0) uniform sampler2D depth_tex;
layout(binding = 1) uniform isampler2D stencil_tex;

layout(location = 0) out vec4 color;

float conv_to_float(uint value, uint mantissa_bits) {
    uint exp = (value >> mantissa_bits) & 0x1Fu;
    uint mantissa_shift = 32u - mantissa_bits;
    uint mantissa = (value << mantissa_shift) >> mantissa_shift;
    return uintBitsToFloat((exp << 23) | (mantissa << (23 - mantissa_bits)));
}

void main() {
    ivec2 coord = ivec2(gl_FragCoord.xy);
    uint depth = uint(textureLod(depth_tex, coord, 0).r * (exp2(32.0) - 1.0f));
    uint stencil = uint(textureLod(stencil_tex, coord, 0).r);
    uint depth_stencil = (stencil << 24) | (depth >> 8);
    uint red_int = (depth_stencil >> 21) & 0x07FF;
    uint green_int = (depth_stencil >> 10) & 0x07FF;
    uint blue_int = depth_stencil & 0x03FF;

    color.r = conv_to_float(red_int, 6u);
    color.g = conv_to_float(green_int, 6u);
    color.b = conv_to_float(blue_int, 5u);
    color.a = 1.0f;
}