gpu: write D16 demotion results with one 16-bit store

Co-authored-by: strxno <rokas.pettersen@gmail.com>
This commit is contained in:
nmzikandstrxno committed 2026-10-27 07:04:38 +01:00
1 parent 770438cee0
commit 556538bed5
2 files changed
+4 -7

No files matched your search

@@ -484,7 +484,7 @@ void TileManager::ConvertD16(Result source, Result target, D16Direction directio
vk::AccessFlagBits::eHostWrite | vk::AccessFlagBits::eHostWrite |
vk::AccessFlagBits::eTransferWrite | vk::AccessFlagBits::eTransferWrite |
vk::AccessFlagBits::eShaderWrite; vk::AccessFlagBits::eShaderWrite;
barriers[1].dstAccessMask = vk::AccessFlagBits::eShaderRead | vk::AccessFlagBits::eShaderWrite; barriers[1].dstAccessMask = vk::AccessFlagBits::eShaderWrite;
command.pipelineBarrier( command.pipelineBarrier(
vk::PipelineStageFlagBits::eAllCommands | vk::PipelineStageFlagBits::eHost, vk::PipelineStageFlagBits::eAllCommands | vk::PipelineStageFlagBits::eHost,
vk::PipelineStageFlagBits::eComputeShader, {}, 0, nullptr, 2, barriers, 0, nullptr); vk::PipelineStageFlagBits::eComputeShader, {}, 0, nullptr, 2, barriers, 0, nullptr);
@@ -1,10 +1,11 @@
#version 450 #version 450
#extension GL_EXT_shader_16bit_storage : require
layout(constant_id = 0) const uint D32 = 0u; layout(constant_id = 0) const uint D32 = 0u;
layout(local_size_x = 64) in; layout(local_size_x = 64) in;
layout(set = 0, binding = 0, std430) readonly buffer Input { uint data[]; } input_buffer; layout(set = 0, binding = 0, std430) readonly buffer Input { uint data[]; } input_buffer;
layout(set = 0, binding = 1, std430) buffer Output { uint data[]; } output_buffer; layout(set = 0, binding = 1, std430) buffer Output { uint16_t data[]; } output_buffer;
layout(push_constant, std430) uniform Conversion { layout(push_constant, std430) uniform Conversion {
uint src_base; uint src_base;
@@ -32,9 +33,5 @@ void main() {
} }
uint src = params.src_base + y * params.source_pitch + x * 4u; uint src = params.src_base + y * params.source_pitch + x * 4u;
uint dst = params.dst_base + y * params.target_pitch + x * 2u; uint dst = params.dst_base + y * params.target_pitch + x * 2u;
uint shift = (dst & 2u) * 8u; output_buffer.data[dst >> 1u] = uint16_t(decode(input_buffer.data[src >> 2u]));
uint mask = 0xffffu << shift;
uint word = dst >> 2u;
atomicAnd(output_buffer.data[word], ~mask);
atomicOr(output_buffer.data[word], decode(input_buffer.data[src >> 2u]) << shift);
} }