mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-03 13:11:34 +00:00
This CL implements f16 in uniform and storage address space, allowing using f16 types in uniform and storage buffers on all backends. Tint uint tests and Dawn E2E tests are added to validate the f16 types work as expected. Bug: tint:1473, tint:1502 Change-Id: I15e3de1033d3727f2ea33f4657f682c5f13c2153 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/106320 Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Zhaoming Jiang <zhaoming.jiang@intel.com> Reviewed-by: Ben Clayton <bclayton@google.com>
36 lines
2.1 KiB
HLSL
36 lines
2.1 KiB
HLSL
cbuffer cbuffer_data : register(b0, space0) {
|
|
uint4 data[3];
|
|
};
|
|
|
|
matrix<float16_t, 4, 3> tint_symbol_3(uint4 buffer[3], uint offset) {
|
|
const uint scalar_offset = ((offset + 0u)) / 4;
|
|
uint4 ubo_load_1 = buffer[scalar_offset / 4];
|
|
uint2 ubo_load = ((scalar_offset & 2) ? ubo_load_1.zw : ubo_load_1.xy);
|
|
vector<float16_t, 2> ubo_load_xz = vector<float16_t, 2>(f16tof32(ubo_load & 0xFFFF));
|
|
float16_t ubo_load_y = f16tof32(ubo_load[0] >> 16);
|
|
const uint scalar_offset_1 = ((offset + 8u)) / 4;
|
|
uint4 ubo_load_3 = buffer[scalar_offset_1 / 4];
|
|
uint2 ubo_load_2 = ((scalar_offset_1 & 2) ? ubo_load_3.zw : ubo_load_3.xy);
|
|
vector<float16_t, 2> ubo_load_2_xz = vector<float16_t, 2>(f16tof32(ubo_load_2 & 0xFFFF));
|
|
float16_t ubo_load_2_y = f16tof32(ubo_load_2[0] >> 16);
|
|
const uint scalar_offset_2 = ((offset + 16u)) / 4;
|
|
uint4 ubo_load_5 = buffer[scalar_offset_2 / 4];
|
|
uint2 ubo_load_4 = ((scalar_offset_2 & 2) ? ubo_load_5.zw : ubo_load_5.xy);
|
|
vector<float16_t, 2> ubo_load_4_xz = vector<float16_t, 2>(f16tof32(ubo_load_4 & 0xFFFF));
|
|
float16_t ubo_load_4_y = f16tof32(ubo_load_4[0] >> 16);
|
|
const uint scalar_offset_3 = ((offset + 24u)) / 4;
|
|
uint4 ubo_load_7 = buffer[scalar_offset_3 / 4];
|
|
uint2 ubo_load_6 = ((scalar_offset_3 & 2) ? ubo_load_7.zw : ubo_load_7.xy);
|
|
vector<float16_t, 2> ubo_load_6_xz = vector<float16_t, 2>(f16tof32(ubo_load_6 & 0xFFFF));
|
|
float16_t ubo_load_6_y = f16tof32(ubo_load_6[0] >> 16);
|
|
return matrix<float16_t, 4, 3>(vector<float16_t, 3>(ubo_load_xz[0], ubo_load_y, ubo_load_xz[1]), vector<float16_t, 3>(ubo_load_2_xz[0], ubo_load_2_y, ubo_load_2_xz[1]), vector<float16_t, 3>(ubo_load_4_xz[0], ubo_load_4_y, ubo_load_4_xz[1]), vector<float16_t, 3>(ubo_load_6_xz[0], ubo_load_6_y, ubo_load_6_xz[1]));
|
|
}
|
|
|
|
void main() {
|
|
uint2 ubo_load_8 = data[2].xy;
|
|
vector<float16_t, 2> ubo_load_8_xz = vector<float16_t, 2>(f16tof32(ubo_load_8 & 0xFFFF));
|
|
float16_t ubo_load_8_y = f16tof32(ubo_load_8[0] >> 16);
|
|
const vector<float16_t, 4> x = mul(tint_symbol_3(data, 0u), vector<float16_t, 3>(ubo_load_8_xz[0], ubo_load_8_y, ubo_load_8_xz[1]));
|
|
return;
|
|
}
|