31 lines
1.1 KiB
Text
31 lines
1.1 KiB
Text
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
|
||
|
#version 450 core
|
||
|
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
|
||
|
|
||
|
layout (binding = 0, rgba8) uniform readonly restrict image2DMSArray msaa_in;
|
||
|
layout (binding = 1, rgba8) uniform writeonly restrict image2DArray output_img;
|
||
|
|
||
|
void main() {
|
||
|
const ivec3 coords = ivec3(gl_GlobalInvocationID);
|
||
|
if (any(greaterThanEqual(coords, imageSize(msaa_in)))) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// TODO: Specialization constants for num_samples?
|
||
|
const int num_samples = imageSamples(msaa_in);
|
||
|
for (int curr_sample = 0; curr_sample < num_samples; ++curr_sample) {
|
||
|
const vec4 pixel = imageLoad(msaa_in, coords, curr_sample);
|
||
|
|
||
|
const int single_sample_x = 2 * coords.x + (curr_sample & 1);
|
||
|
const int single_sample_y = 2 * coords.y + ((curr_sample / 2) & 1);
|
||
|
const ivec3 dest_coords = ivec3(single_sample_x, single_sample_y, coords.z);
|
||
|
|
||
|
if (any(greaterThanEqual(dest_coords, imageSize(output_img)))) {
|
||
|
continue;
|
||
|
}
|
||
|
imageStore(output_img, dest_coords, pixel);
|
||
|
}
|
||
|
}
|