Merge remote-tracking branch 'xenia-master/master' into canary_experimental

This commit is contained in:
Herman S.
2026-03-06 14:10:00 +09:00
65 changed files with 1497 additions and 2231 deletions

View File

@@ -20,10 +20,10 @@
// can't exceed 11 bits, and the modulo operator doesn't need to be performed to
// access the data in the render targets that are located in both ends of the
// EDRAM at the same time.
uint XeEdramOffsetInts(uint2_xe pixel_index, uint base_tiles, bool wrap,
uint pitch_tiles, uint msaa_samples, bool is_depth,
uint format_ints_log2, uint pixel_sample_index,
uint2_xe resolution_scale) {
uint XeEdramOffsetBytes(uint2_xe pixel_index, uint base_tiles, bool wrap,
uint pitch_tiles, uint msaa_samples, bool is_depth,
uint format_ints_log2, uint pixel_sample_index,
uint2_xe resolution_scale) {
uint2_xe rt_sample_index =
pixel_index <<
uint2_xe(greater_than_equal_xe(
@@ -54,7 +54,7 @@ uint XeEdramOffsetInts(uint2_xe pixel_index, uint base_tiles, bool wrap,
// EDRAM addressing is periodic (modulo the EDRAM size).
address %= tile_size_at_32bpp.x * tile_size_at_32bpp.y * 2048u;
}
return address;
return address << 2;
}
#endif // XENIA_GPU_SHADERS_EDRAM_XESLI_

View File

@@ -10,15 +10,15 @@
#include "edram.xesli"
#include "host_depth_store.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_host_depth_store_dest, set=0, binding=0,
u0, space0)
byte_buffer_align16_wo_declare_xe(xe_host_depth_store_dest, set=0, binding=0,
u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_HOST_DEPTH_STORE_PUSH_CONSTANTS_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_host_depth_store_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_host_depth_store_dest, buffer(1))
entry_binding_next_xe
texture_xe(texture_2d_xe, xe_host_depth_store_source, set=1, binding=0, t0,
space0, texture(0))
@@ -40,14 +40,12 @@ entry_inputs_end_code_begin_compute_xe
int2_xe pixel_index = int2_xe(
XeHostDepthStoreRectUnscaledOrigin(rect_constant) * resolution_scale +
(in_global_thread_id_xe.xy << uint2_xe(3u, 0u)));
uint edram_address_int4s =
XeEdramOffsetInts(uint2_xe(pixel_index), 0u, false,
XeHostDepthStoreRTPitchTiles(rt_constant),
kXenosMsaaSamples_1X, false, 0u, 0u,
resolution_scale)
>> 2u;
array_buffer_store_xe(
xe_host_depth_store_dest, edram_address_int4s,
uint edram_address = XeEdramOffsetBytes(
uint2_xe(pixel_index), 0u, false,
XeHostDepthStoreRTPitchTiles(rt_constant), kXenosMsaaSamples_1X, false,
0u, 0u, resolution_scale);
byte_buffer_align16_store16_xe(
xe_host_depth_store_dest, edram_address,
float_bits_to_uint_xe(float4_xe(
texel_fetch_2d_xe(xe_host_depth_store_source, pixel_index, 0).r,
texel_fetch_2d_xe(xe_host_depth_store_source,
@@ -56,8 +54,8 @@ entry_inputs_end_code_begin_compute_xe
pixel_index + int2_xe(2, 0), 0).r,
texel_fetch_2d_xe(xe_host_depth_store_source,
pixel_index + int2_xe(3, 0), 0).r)));
array_buffer_store_xe(
xe_host_depth_store_dest, edram_address_int4s + 1u,
byte_buffer_align16_store16_xe(
xe_host_depth_store_dest, edram_address + 16u,
float_bits_to_uint_xe(float4_xe(
texel_fetch_2d_xe(xe_host_depth_store_source,
pixel_index + int2_xe(4, 0), 0).r,

View File

@@ -10,15 +10,15 @@
#include "edram.xesli"
#include "host_depth_store.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_host_depth_store_dest, set=0, binding=0,
u0, space0)
byte_buffer_align16_wo_declare_xe(xe_host_depth_store_dest, set=0, binding=0,
u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_HOST_DEPTH_STORE_PUSH_CONSTANTS_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_host_depth_store_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_host_depth_store_dest, buffer(1))
entry_binding_next_xe
texture_xe(texture_2d_ms_xe, xe_host_depth_store_source, set=1, binding=0,
t0, space0, texture(0))
@@ -41,20 +41,18 @@ entry_inputs_end_code_begin_compute_xe
XeHostDepthStoreRectUnscaledOrigin(rect_constant) * resolution_scale +
uint2_xe(in_global_thread_id_xe.x << 3u, in_global_thread_id_xe.y >> 1u));
uint dest_sample_index = in_global_thread_id_xe.y & 1u;
uint edram_address_int4s =
XeEdramOffsetInts(uint2_xe(pixel_index), 0u, false,
XeHostDepthStoreRTPitchTiles(rt_constant),
kXenosMsaaSamples_2X, false, 0u, dest_sample_index,
resolution_scale)
>> 2u;
uint edram_address = XeEdramOffsetBytes(
uint2_xe(pixel_index), 0u, false,
XeHostDepthStoreRTPitchTiles(rt_constant), kXenosMsaaSamples_2X, false,
0u, dest_sample_index, resolution_scale);
// Top and bottom to Direct3D 10.1+ and Vulkan top 1 and bottom 0 (for 2x) or
// top-left 0 and bottom-right 3 (for 4x).
int source_sample_index =
XeHostDepthStoreRTMsaa2xSupported(rt_constant)
? (bool(dest_sample_index) ? 0 : 1)
: (bool(dest_sample_index) ? 3 : 0);
array_buffer_store_xe(
xe_host_depth_store_dest, edram_address_int4s,
byte_buffer_align16_store16_xe(
xe_host_depth_store_dest, edram_address,
float_bits_to_uint_xe(float4_xe(
texel_fetch_2d_ms_xe(xe_host_depth_store_source, pixel_index,
source_sample_index).r,
@@ -67,8 +65,8 @@ entry_inputs_end_code_begin_compute_xe
texel_fetch_2d_ms_xe(xe_host_depth_store_source,
pixel_index + int2_xe(3, 0),
source_sample_index).r)));
array_buffer_store_xe(
xe_host_depth_store_dest, edram_address_int4s + 1u,
byte_buffer_align16_store16_xe(
xe_host_depth_store_dest, edram_address + 16u,
float_bits_to_uint_xe(float4_xe(
texel_fetch_2d_ms_xe(xe_host_depth_store_source,
pixel_index + int2_xe(4, 0),

View File

@@ -10,15 +10,15 @@
#include "edram.xesli"
#include "host_depth_store.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_host_depth_store_dest, set=0, binding=0,
u0, space0)
byte_buffer_align16_wo_declare_xe(xe_host_depth_store_dest, set=0, binding=0,
u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_HOST_DEPTH_STORE_PUSH_CONSTANTS_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_host_depth_store_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_host_depth_store_dest, buffer(1))
entry_binding_next_xe
texture_xe(texture_2d_ms_xe, xe_host_depth_store_source, set=1, binding=0,
t0, space0, texture(0))
@@ -40,18 +40,17 @@ entry_inputs_end_code_begin_compute_xe
int2_xe pixel_index = int2_xe(
XeHostDepthStoreRectUnscaledOrigin(rect_constant) * resolution_scale +
uint2_xe(in_global_thread_id_xe.x << 2u, in_global_thread_id_xe.y >> 1u));
// For simplicity, passing samples directly, not pixels, to XeEdramOffsetInts.
uint edram_address_int4s =
XeEdramOffsetInts(
(uint2_xe(pixel_index) << 1u) | (in_global_thread_id_xe.xy & 1u),
0u, false, XeHostDepthStoreRTPitchTiles(rt_constant),
kXenosMsaaSamples_1X, false, 0u, 0u, resolution_scale)
>> 2u;
// For simplicity, passing samples directly, not pixels, to
// XeEdramOffsetBytes.
uint edram_address = XeEdramOffsetBytes(
(uint2_xe(pixel_index) << 1u) | (in_global_thread_id_xe.xy & 1u), 0u,
false, XeHostDepthStoreRTPitchTiles(rt_constant), kXenosMsaaSamples_1X,
false, 0u, 0u, resolution_scale);
// Render target horizontal sample in bit 0, vertical sample in bit 1.
int source_sample_left = int((in_global_thread_id_xe.y & 1u) << 1u);
int source_sample_right = source_sample_left + 1;
array_buffer_store_xe(
xe_host_depth_store_dest, edram_address_int4s,
byte_buffer_align16_store16_xe(
xe_host_depth_store_dest, edram_address,
float_bits_to_uint_xe(float4_xe(
texel_fetch_2d_ms_xe(xe_host_depth_store_source, pixel_index,
source_sample_left).r,
@@ -63,8 +62,8 @@ entry_inputs_end_code_begin_compute_xe
texel_fetch_2d_ms_xe(xe_host_depth_store_source,
pixel_index + int2_xe(1, 0),
source_sample_right).r)));
array_buffer_store_xe(
xe_host_depth_store_dest, edram_address_int4s + 1u,
byte_buffer_align16_store16_xe(
xe_host_depth_store_dest, edram_address + 16u,
float_bits_to_uint_xe(float4_xe(
texel_fetch_2d_ms_xe(xe_host_depth_store_source,
pixel_index + int2_xe(2, 0),

View File

@@ -44,18 +44,22 @@ push_const_end_xe
#define XE_RESOLVE_PUSH_CONST_BINDING push_const_binding_xe(buffer(0))
#ifndef XE_RESOLVE_CLEAR
#ifdef XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
uint_vector_buffer_declare_xe(xe_resolve_edram, set=0, binding=0, t0,
space0)
#define XE_RESOLVE_COPY_EDRAM_BINDING \
uint_vector_buffer_binding_xe(xe_resolve_edram, buffer(2))
#else
array_buffer_declare_xe(XE_RESOLVE_SOURCE_TYPE, xe_resolve_edram, set=0,
binding=0, t0, space0)
#define XE_RESOLVE_COPY_EDRAM_BINDING \
array_buffer_binding_xe(XE_RESOLVE_SOURCE_TYPE, xe_resolve_edram, \
buffer(2))
#if XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 4
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO \
byte_buffer_align4_declare_xe
#elif XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 8
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO \
byte_buffer_align8_declare_xe
#elif XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 16
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO \
byte_buffer_align16_declare_xe
#endif
#ifdef XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO
XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_DECLARE_MACRO(xe_resolve_edram, set=0,
binding=0, t0, space0)
#endif
#define XE_RESOLVE_COPY_EDRAM_BINDING \
byte_buffer_binding_xe(xe_resolve_edram, buffer(2))
#endif
struct XeResolveInfo {
@@ -153,8 +157,8 @@ XeResolveInfo XeResolveGetInfo(param_push_consts_xe) {
return resolve_info;
}
uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
return 1u << (resolve_info.edram_format_ints_log2 +
uint XeResolveEdramPixelStrideBytes(XeResolveInfo resolve_info) {
return 4u << (resolve_info.edram_format_ints_log2 +
uint(resolve_info.edram_msaa_samples >= kXenosMsaaSamples_4X));
}
@@ -231,9 +235,9 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
// Offset to the first sample to participate in averaging (or the sample to be
// copied if not averaging).
uint XeResolveColorCopySourcePixelAddressIntsYHalfPixelOffsetFilling(
uint XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(
XeResolveInfo resolve_info, uint2_xe pixel_index) {
return XeEdramOffsetInts(
return XeEdramOffsetBytes(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
@@ -457,116 +461,114 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
}
}
#ifdef XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
#if XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 4
void XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(
param_uint_vector_buffer_xe(xe_resolve_edram)
param_next_after_uint_vector_buffer_xe
uint sample_address_ints, uint pixel_stride_ints, uint format_ints_log2,
uint format, out_param_xe(float4_xe, pixel_0),
param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe
uint sample_address_bytes, uint pixel_stride_bytes,
uint format_ints_log2, uint format, out_param_xe(float4_xe, pixel_0),
out_param_xe(float4_xe, pixel_1)) {
dont_flatten_xe if (format_ints_log2 != 0u) {
uint4_xe packed;
dont_flatten_xe if (pixel_stride_ints == 2u) {
packed = uint_vector_buffer_load4_xe(
xe_resolve_edram, sample_address_ints);
dont_flatten_xe if (pixel_stride_bytes == 8u) {
packed = byte_buffer_align4_load16u_xe(
xe_resolve_edram, sample_address_bytes);
} else {
packed.xy = uint_vector_buffer_load2_xe(
xe_resolve_edram, sample_address_ints);
packed.zw = uint_vector_buffer_load2_xe(
xe_resolve_edram, sample_address_ints + pixel_stride_ints);
packed.xy = byte_buffer_align4_load8u_xe(
xe_resolve_edram, sample_address_bytes);
packed.zw = byte_buffer_align4_load8u_xe(
xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);
}
XeResolveUnpack64bpp2Samples(packed, format, pixel_0, pixel_1);
} else {
uint2_xe packed;
dont_flatten_xe if (pixel_stride_ints == 1u) {
packed = uint_vector_buffer_load2_xe(
xe_resolve_edram, sample_address_ints);
dont_flatten_xe if (pixel_stride_bytes == 4u) {
packed = byte_buffer_align4_load8u_xe(
xe_resolve_edram, sample_address_bytes);
} else {
packed.x = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints);
packed.y = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + pixel_stride_ints);
packed.x = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes);
packed.y = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);
}
XeResolveUnpack32bpp2Samples(packed, format, pixel_0, pixel_1);
}
}
void XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(
param_uint_vector_buffer_xe(xe_resolve_edram)
param_next_after_uint_vector_buffer_xe
uint sample_address_ints, uint pixel_stride_ints, uint format_ints_log2,
uint format, out_param_xe(float4_xe, pixel_0),
param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe
uint sample_address_bytes, uint pixel_stride_bytes,
uint format_ints_log2, uint format, out_param_xe(float4_xe, pixel_0),
out_param_xe(float4_xe, pixel_1), out_param_xe(float4_xe, pixel_2),
out_param_xe(float4_xe, pixel_3)) {
dont_flatten_xe if (format_ints_log2 != 0u) {
uint4_xe packed_01, packed_23;
dont_flatten_xe if (pixel_stride_ints == 2u) {
packed_01 = uint_vector_buffer_load4_xe(
xe_resolve_edram, sample_address_ints);
packed_23 = uint_vector_buffer_load4_xe(
xe_resolve_edram, sample_address_ints + 4u);
dont_flatten_xe if (pixel_stride_bytes == 8u) {
packed_01 = byte_buffer_align4_load16u_xe(
xe_resolve_edram, sample_address_bytes);
packed_23 = byte_buffer_align4_load16u_xe(
xe_resolve_edram, sample_address_bytes + 16u);
} else {
packed_01.xy = uint_vector_buffer_load2_xe(
xe_resolve_edram, sample_address_ints);
packed_01.zw = uint_vector_buffer_load2_xe(
xe_resolve_edram, sample_address_ints + pixel_stride_ints);
packed_23.xy = uint_vector_buffer_load2_xe(
xe_resolve_edram, sample_address_ints + 2u * pixel_stride_ints);
packed_23.zw = uint_vector_buffer_load2_xe(
xe_resolve_edram, sample_address_ints + 3u * pixel_stride_ints);
packed_01.xy = byte_buffer_align4_load8u_xe(
xe_resolve_edram, sample_address_bytes);
packed_01.zw = byte_buffer_align4_load8u_xe(
xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);
packed_23.xy = byte_buffer_align4_load8u_xe(
xe_resolve_edram, sample_address_bytes + 2u * pixel_stride_bytes);
packed_23.zw = byte_buffer_align4_load8u_xe(
xe_resolve_edram, sample_address_bytes + 3u * pixel_stride_bytes);
}
XeResolveUnpack64bpp4Samples(packed_01, packed_23, format, pixel_0,
pixel_1, pixel_2, pixel_3);
} else {
uint4_xe packed;
dont_flatten_xe if (pixel_stride_ints == 1u) {
packed = uint_vector_buffer_load4_xe(
xe_resolve_edram, sample_address_ints);
dont_flatten_xe if (pixel_stride_bytes == 4u) {
packed = byte_buffer_align4_load16u_xe(
xe_resolve_edram, sample_address_bytes);
} else {
packed.x = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints);
packed.y = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + pixel_stride_ints);
packed.z = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 2u * pixel_stride_ints);
packed.w = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 3u * pixel_stride_ints);
packed.x = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes);
packed.y = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);
packed.z = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 2u * pixel_stride_bytes);
packed.w = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 3u * pixel_stride_bytes);
}
XeResolveUnpack32bpp4Samples(packed, format, pixel_0, pixel_1, pixel_2,
pixel_3);
}
}
// For red/blue swapping for 64bpp, pre-add 1 to sample_address_ints.
// For red/blue swapping for 64bpp, pre-add 4 to sample_address_bytes.
void XeResolveLoad8RedPixelSamplesFromRaw(
param_uint_vector_buffer_xe(xe_resolve_edram)
param_next_after_uint_vector_buffer_xe
uint sample_address_ints, uint pixel_stride_ints, uint format_ints_log2,
uint format, bool swap_32bpp, out_param_xe(float4_xe, pixels_0123),
param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe
uint sample_address_bytes, uint pixel_stride_bytes,
uint format_ints_log2, uint format, bool swap_32bpp,
out_param_xe(float4_xe, pixels_0123),
out_param_xe(float4_xe, pixels_4567)) {
uint4_xe packed_0123, packed_4567;
dont_flatten_xe if (pixel_stride_ints == 1u) {
packed_0123 = uint_vector_buffer_load4_xe(
xe_resolve_edram, sample_address_ints);
packed_4567 = uint_vector_buffer_load4_xe(
xe_resolve_edram, sample_address_ints + 4u);
dont_flatten_xe if (pixel_stride_bytes == 4u) {
packed_0123 = byte_buffer_align4_load16u_xe(
xe_resolve_edram, sample_address_bytes);
packed_4567 = byte_buffer_align4_load16u_xe(
xe_resolve_edram, sample_address_bytes + 16u);
} else {
packed_0123.x = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints);
packed_0123.y = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + pixel_stride_ints);
packed_0123.z = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 2u * pixel_stride_ints);
packed_0123.w = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 3u * pixel_stride_ints);
packed_4567.x = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 4u * pixel_stride_ints);
packed_4567.y = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 5u * pixel_stride_ints);
packed_4567.z = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 6u * pixel_stride_ints);
packed_4567.w = uint_vector_buffer_load1_xe(
xe_resolve_edram, sample_address_ints + 7u * pixel_stride_ints);
packed_0123.x = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes);
packed_0123.y = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + pixel_stride_bytes);
packed_0123.z = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 2u * pixel_stride_bytes);
packed_0123.w = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 3u * pixel_stride_bytes);
packed_4567.x = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 4u * pixel_stride_bytes);
packed_4567.y = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 5u * pixel_stride_bytes);
packed_4567.z = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 6u * pixel_stride_bytes);
packed_4567.w = byte_buffer_align4_load4_xe(
xe_resolve_edram, sample_address_bytes + 7u * pixel_stride_bytes);
}
dont_flatten_xe if (format_ints_log2 != 0u) {
XeResolveUnpack64bpp8RedUnswappedSamples(packed_0123, packed_4567,
@@ -579,48 +581,46 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
}
void XeResolveLoad2RGBAColors(
param_uint_vector_buffer_xe(xe_resolve_edram)
param_next_after_uint_vector_buffer_xe
XeResolveInfo resolve_info, uint address_ints,
param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe
XeResolveInfo resolve_info, uint address_bytes,
out_param_xe(float4_xe, pixel_0), out_param_xe(float4_xe, pixel_1)) {
uint pixel_stride_ints = XeResolveEdramPixelStrideInts(resolve_info);
uint pixel_stride_bytes = XeResolveEdramPixelStrideBytes(resolve_info);
XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints, pixel_stride_ints, resolve_info.edram_format_ints_log2,
resolve_info.edram_format, pixel_0, pixel_1);
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
address_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
pixel_0, pixel_1);
float exp_bias = resolve_info.dest_exp_bias_factor;
dont_flatten_xe
if (resolve_info.sample_select >= kXenosCopySampleSelect_01) {
uint tile_row_stride_ints = 80u * resolve_info.resolution_scale.x;
uint tile_row_stride_bytes = 4u * 80u * resolve_info.resolution_scale.x;
// TODO(Triang3l): Gamma-correct resolve for 8_8_8_8_GAMMA.
exp_bias *= 0.5f;
float4_xe msaa_resolve_pixel_0, msaa_resolve_pixel_1;
XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + tile_row_stride_ints, pixel_stride_ints,
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
address_bytes + tile_row_stride_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
msaa_resolve_pixel_0, msaa_resolve_pixel_1);
pixel_0 += msaa_resolve_pixel_0;
pixel_1 += msaa_resolve_pixel_1;
dont_flatten_xe
if (resolve_info.sample_select >= kXenosCopySampleSelect_0123) {
uint sample_stride_ints = 1u << resolve_info.edram_format_ints_log2;
uint sample_stride_bytes = 4u << resolve_info.edram_format_ints_log2;
exp_bias *= 0.5f;
XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + sample_stride_ints, pixel_stride_ints,
pass_byte_buffer_xe(xe_resolve_edram)
pass_next_after_byte_buffer_xe
address_bytes + sample_stride_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
msaa_resolve_pixel_0, msaa_resolve_pixel_1);
pixel_0 += msaa_resolve_pixel_0;
pixel_1 += msaa_resolve_pixel_1;
XeResolveLoad2RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + tile_row_stride_ints + sample_stride_ints,
pixel_stride_ints, resolve_info.edram_format_ints_log2,
pass_byte_buffer_xe(xe_resolve_edram)
pass_next_after_byte_buffer_xe
address_bytes + tile_row_stride_bytes + sample_stride_bytes,
pixel_stride_bytes, resolve_info.edram_format_ints_log2,
resolve_info.edram_format, msaa_resolve_pixel_0,
msaa_resolve_pixel_1);
pixel_0 += msaa_resolve_pixel_0;
@@ -636,21 +636,20 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
}
void XeResolveLoad4RGBAColors(
param_uint_vector_buffer_xe(xe_resolve_edram)
param_next_after_uint_vector_buffer_xe
XeResolveInfo resolve_info, uint address_ints,
param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe
XeResolveInfo resolve_info, uint address_bytes,
out_param_xe(float4_xe, pixel_0), out_param_xe(float4_xe, pixel_1),
out_param_xe(float4_xe, pixel_2), out_param_xe(float4_xe, pixel_3)) {
uint pixel_stride_ints = XeResolveEdramPixelStrideInts(resolve_info);
uint pixel_stride_bytes = XeResolveEdramPixelStrideBytes(resolve_info);
XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints, pixel_stride_ints, resolve_info.edram_format_ints_log2,
resolve_info.edram_format, pixel_0, pixel_1, pixel_2, pixel_3);
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
address_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
pixel_0, pixel_1, pixel_2, pixel_3);
float exp_bias = resolve_info.dest_exp_bias_factor;
dont_flatten_xe
if (resolve_info.sample_select >= kXenosCopySampleSelect_01) {
uint tile_row_stride_ints = 80u * resolve_info.resolution_scale.x;
uint tile_row_stride_bytes = 4u * 80u * resolve_info.resolution_scale.x;
// TODO(Triang3l): Gamma-correct resolve for 8_8_8_8_GAMMA.
exp_bias *= 0.5f;
float4_xe msaa_resolve_pixel_0;
@@ -658,9 +657,8 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
float4_xe msaa_resolve_pixel_2;
float4_xe msaa_resolve_pixel_3;
XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + tile_row_stride_ints, pixel_stride_ints,
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
address_bytes + tile_row_stride_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
msaa_resolve_pixel_0, msaa_resolve_pixel_1, msaa_resolve_pixel_2,
msaa_resolve_pixel_3);
@@ -670,12 +668,12 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
pixel_3 += msaa_resolve_pixel_3;
dont_flatten_xe
if (resolve_info.sample_select >= kXenosCopySampleSelect_0123) {
uint sample_stride_ints = 1u << resolve_info.edram_format_ints_log2;
uint sample_stride_bytes = 4u << resolve_info.edram_format_ints_log2;
exp_bias *= 0.5f;
XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + sample_stride_ints, pixel_stride_ints,
pass_byte_buffer_xe(xe_resolve_edram)
pass_next_after_byte_buffer_xe
address_bytes + sample_stride_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
msaa_resolve_pixel_0, msaa_resolve_pixel_1, msaa_resolve_pixel_2,
msaa_resolve_pixel_3);
@@ -684,10 +682,10 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
pixel_2 += msaa_resolve_pixel_2;
pixel_3 += msaa_resolve_pixel_3;
XeResolveLoad4RGBAUnswappedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + tile_row_stride_ints + sample_stride_ints,
pixel_stride_ints, resolve_info.edram_format_ints_log2,
pass_byte_buffer_xe(xe_resolve_edram)
pass_next_after_byte_buffer_xe
address_bytes + tile_row_stride_bytes + sample_stride_bytes,
pixel_stride_bytes, resolve_info.edram_format_ints_log2,
resolve_info.edram_format, msaa_resolve_pixel_0,
msaa_resolve_pixel_1, msaa_resolve_pixel_2, msaa_resolve_pixel_3);
pixel_0 += msaa_resolve_pixel_0;
@@ -709,33 +707,30 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
}
void XeResolveLoad8RedColors(
param_uint_vector_buffer_xe(xe_resolve_edram)
param_next_after_uint_vector_buffer_xe
XeResolveInfo resolve_info, uint address_ints,
param_byte_buffer_xe(xe_resolve_edram) param_next_after_byte_buffer_xe
XeResolveInfo resolve_info, uint address_bytes,
out_param_xe(float4_xe, pixels_0123),
out_param_xe(float4_xe, pixels_4567)) {
uint pixel_stride_ints = XeResolveEdramPixelStrideInts(resolve_info);
if (resolve_info.dest_swap) {
uint pixel_stride_bytes = XeResolveEdramPixelStrideBytes(resolve_info);
if (resolve_info.dest_swap && resolve_info.edram_format_ints_log2 != 0u) {
// Likely want to load the blue part from the right half for 64bpp.
address_ints += resolve_info.edram_format_ints_log2;
address_bytes += 4u;
}
XeResolveLoad8RedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints, pixel_stride_ints, resolve_info.edram_format_ints_log2,
resolve_info.edram_format, resolve_info.dest_swap, pixels_0123,
pixels_4567);
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
address_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
resolve_info.dest_swap, pixels_0123, pixels_4567);
float exp_bias = resolve_info.dest_exp_bias_factor;
dont_flatten_xe
if (resolve_info.sample_select >= kXenosCopySampleSelect_01) {
uint tile_row_stride_ints = 80u * resolve_info.resolution_scale.x;
uint tile_row_stride_bytes = 4u * 80u * resolve_info.resolution_scale.x;
// TODO(Triang3l): Gamma-correct resolve for 8_8_8_8_GAMMA.
exp_bias *= 0.5f;
float4_xe msaa_resolve_pixels_0123, msaa_resolve_pixels_4567;
XeResolveLoad8RedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + tile_row_stride_ints, pixel_stride_ints,
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
address_bytes + tile_row_stride_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
resolve_info.dest_swap, msaa_resolve_pixels_0123,
msaa_resolve_pixels_4567);
@@ -743,22 +738,22 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
pixels_4567 += msaa_resolve_pixels_4567;
dont_flatten_xe
if (resolve_info.sample_select >= kXenosCopySampleSelect_0123) {
uint sample_stride_ints = 1u << resolve_info.edram_format_ints_log2;
uint sample_stride_bytes = 4u << resolve_info.edram_format_ints_log2;
exp_bias *= 0.5f;
XeResolveLoad8RedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + sample_stride_ints, pixel_stride_ints,
pass_byte_buffer_xe(xe_resolve_edram)
pass_next_after_byte_buffer_xe
address_bytes + sample_stride_bytes, pixel_stride_bytes,
resolve_info.edram_format_ints_log2, resolve_info.edram_format,
resolve_info.dest_swap, msaa_resolve_pixels_0123,
msaa_resolve_pixels_4567);
pixels_0123 += msaa_resolve_pixels_0123;
pixels_4567 += msaa_resolve_pixels_4567;
XeResolveLoad8RedPixelSamplesFromRaw(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
address_ints + tile_row_stride_ints + sample_stride_ints,
pixel_stride_ints, resolve_info.edram_format_ints_log2,
pass_byte_buffer_xe(xe_resolve_edram)
pass_next_after_byte_buffer_xe
address_bytes + tile_row_stride_bytes + sample_stride_bytes,
pixel_stride_bytes, resolve_info.edram_format_ints_log2,
resolve_info.edram_format, resolve_info.dest_swap,
msaa_resolve_pixels_0123, msaa_resolve_pixels_4567);
pixels_0123 += msaa_resolve_pixels_0123;
@@ -768,7 +763,7 @@ uint XeResolveEdramPixelStrideInts(XeResolveInfo resolve_info) {
pixels_0123 *= exp_bias;
pixels_4567 *= exp_bias;
}
#endif // XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
#endif // XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT == 4
uint4_xe XeResolveSwapRedBlue_8_8_8_8(uint4_xe pixels) {
return (pixels & ~0xFF00FFu) | ((pixels & 0xFFu) << 16u) |

View File

@@ -10,15 +10,15 @@
#define XE_RESOLVE_CLEAR
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_edram, set=0, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_edram, set=0, binding=0, u0,
space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_edram, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_edram, buffer(1))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
@@ -34,17 +34,15 @@ entry_inputs_end_code_begin_compute_xe
resolve_info.width_div_8_scaled << extent_scale.x) {
return;
}
uint address_int4s =
XeEdramOffsetInts(
(in_global_thread_id_xe.xy << uint2_xe(3u, 0u)) +
(resolve_info.edram_offset_scaled << extent_scale),
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_1X, resolve_info.edram_is_depth, 0u, 0u,
resolve_info.resolution_scale)
>> 2u;
array_buffer_store_xe(xe_resolve_edram, address_int4s,
resolve_info.clear_value.xxxx);
array_buffer_store_xe(xe_resolve_edram, address_int4s + 1u,
resolve_info.clear_value.xxxx);
uint address = XeEdramOffsetBytes(
(in_global_thread_id_xe.xy << uint2_xe(3u, 0u)) +
(resolve_info.edram_offset_scaled << extent_scale),
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_1X, resolve_info.edram_is_depth, 0u, 0u,
resolve_info.resolution_scale);
byte_buffer_align16_store16_xe(xe_resolve_edram, address,
resolve_info.clear_value.xxxx);
byte_buffer_align16_store16_xe(xe_resolve_edram, address + 16u,
resolve_info.clear_value.xxxx);
}
entry_code_end_compute_xe

View File

@@ -10,15 +10,15 @@
#define XE_RESOLVE_CLEAR
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_edram, set=0, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_edram, set=0, binding=0, u0,
space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_edram, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_edram, buffer(1))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
@@ -34,17 +34,15 @@ entry_inputs_end_code_begin_compute_xe
resolve_info.width_div_8_scaled << extent_scale.x) {
return;
}
uint address_int4s =
XeEdramOffsetInts(
(in_global_thread_id_xe.xy << uint2_xe(3u, 0u)) +
(resolve_info.edram_offset_scaled << extent_scale),
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_1X, false, 1u, 0u, resolve_info.resolution_scale)
>> 2u;
uint address = XeEdramOffsetBytes(
(in_global_thread_id_xe.xy << uint2_xe(3u, 0u)) +
(resolve_info.edram_offset_scaled << extent_scale),
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_1X, false, 1u, 0u, resolve_info.resolution_scale);
uint i;
unroll_xe for (i = 0u; i < 4u; ++i) {
array_buffer_store_xe(xe_resolve_edram, address_int4s + i,
resolve_info.clear_value.xyxy);
byte_buffer_align16_store16_xe(xe_resolve_edram, address + (i << 4),
resolve_info.clear_value.xyxy);
}
}
entry_code_end_compute_xe

View File

@@ -8,18 +8,17 @@
*/
#include "endian.xesli"
#define XE_RESOLVE_SOURCE_TYPE uint4_xe
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 16
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -34,21 +33,19 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(3u, 0u);
uint source_address_int4s =
XeEdramOffsetInts(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
resolve_info.edram_msaa_samples, resolve_info.edram_is_depth, 0u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale)
>> 2u;
uint4_xe pixels_0123 =
array_buffer_load_xe(xe_resolve_edram, source_address_int4s);
uint4_xe pixels_4567 =
array_buffer_load_xe(xe_resolve_edram, source_address_int4s + 1u);
uint source_address = XeEdramOffsetBytes(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
resolve_info.edram_msaa_samples, resolve_info.edram_is_depth, 0u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale);
uint4_xe pixels_0123 = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address);
uint4_xe pixels_4567 = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 16u);
dont_flatten_xe
if (pixel_index.x == 0u &&
resolve_info.half_pixel_offset_fill_source.x != 0u) {
@@ -61,13 +58,12 @@ entry_inputs_end_code_begin_compute_xe
pixels_0123.x = pixels_0123.y;
}
XeResolveSwap8PixelsRedBlue32bpp(resolve_info, pixels_0123, pixels_4567);
uint dest_address =
XeResolveDestPixelAddress(resolve_info, pixel_index, 2u) >> 4u;
array_buffer_store_xe(
uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 2u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap32(pixels_0123, resolve_info.dest_endian_128));
dest_address += XeResolveLocalXAddressXor(4u, 2u) >> 4u;
array_buffer_store_xe(
dest_address += XeResolveLocalXAddressXor(4u, 2u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap32(pixels_4567, resolve_info.dest_endian_128));
}

View File

@@ -8,18 +8,17 @@
*/
#include "endian.xesli"
#define XE_RESOLVE_SOURCE_TYPE uint4_xe
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 16
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -34,38 +33,36 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(3u, 0u);
uint source_address_int4s =
XeEdramOffsetInts(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_4X, resolve_info.edram_is_depth, 0u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale)
>> 2u;
uint source_address = XeEdramOffsetBytes(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_4X, resolve_info.edram_is_depth, 0u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale);
uint4_xe pixels_0123, pixels_4567;
dont_flatten_xe
if (resolve_info.sample_select != kXenosCopySampleSelect_2 &&
resolve_info.sample_select != kXenosCopySampleSelect_3) {
pixels_0123.xy = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s).xz;
pixels_0123.zw = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s + 1u).xz;
pixels_4567.xy = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s + 2u).xz;
pixels_4567.zw = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s + 3u).xz;
pixels_0123.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address).xz;
pixels_0123.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 0x10u).xz;
pixels_4567.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 0x20u).xz;
pixels_4567.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 0x30u).xz;
} else {
pixels_0123.xy = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s).yw;
pixels_0123.zw = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s + 1u).yw;
pixels_4567.xy = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s + 2u).yw;
pixels_4567.zw = array_buffer_load_xe(
xe_resolve_edram, source_address_int4s + 3u).yw;
pixels_0123.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address).yw;
pixels_0123.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 0x10u).yw;
pixels_4567.xy = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 0x20u).yw;
pixels_4567.zw = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 0x30u).yw;
}
dont_flatten_xe
if (pixel_index.x == 0u &&
@@ -79,13 +76,12 @@ entry_inputs_end_code_begin_compute_xe
pixels_0123.x = pixels_0123.y;
}
XeResolveSwap8PixelsRedBlue32bpp(resolve_info, pixels_0123, pixels_4567);
uint dest_address =
XeResolveDestPixelAddress(resolve_info, pixel_index, 2u) >> 4u;
array_buffer_store_xe(
uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 2u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap32(pixels_0123, resolve_info.dest_endian_128));
dest_address += XeResolveLocalXAddressXor(4u, 2u) >> 4u;
array_buffer_store_xe(
dest_address += XeResolveLocalXAddressXor(4u, 2u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap32(pixels_4567, resolve_info.dest_endian_128));
}

View File

@@ -8,18 +8,17 @@
*/
#include "endian.xesli"
#define XE_RESOLVE_SOURCE_TYPE uint4_xe
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 16
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -34,21 +33,19 @@ entry_inputs_end_code_begin_compute_xe
if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {
return;
}
uint source_address_int4s =
XeEdramOffsetInts(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
resolve_info.edram_msaa_samples, false, 1u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale)
>> 2u;
uint4_xe pixels_01 =
array_buffer_load_xe(xe_resolve_edram, source_address_int4s);
uint4_xe pixels_23 =
array_buffer_load_xe(xe_resolve_edram, source_address_int4s + 1u);
uint source_address = XeEdramOffsetBytes(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
resolve_info.edram_msaa_samples, false, 1u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale);
uint4_xe pixels_01 = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address);
uint4_xe pixels_23 = byte_buffer_align16_load16_xe(xe_resolve_edram,
source_address + 16u);
dont_flatten_xe
if (pixel_index.x == 0u &&
resolve_info.half_pixel_offset_fill_source.x != 0u) {
@@ -61,13 +58,12 @@ entry_inputs_end_code_begin_compute_xe
pixels_01.xy = pixels_01.zw;
}
XeResolveSwap4PixelsRedBlue64bpp(resolve_info, pixels_01, pixels_23);
uint dest_address =
XeResolveDestPixelAddress(resolve_info, pixel_index, 3u) >> 4u;
array_buffer_store_xe(
uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 3u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap64(pixels_01, resolve_info.dest_endian_128));
dest_address += XeResolveLocalXAddressXor(2u, 3u) >> 4u;
array_buffer_store_xe(
dest_address += XeResolveLocalXAddressXor(2u, 3u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap64(pixels_23, resolve_info.dest_endian_128));
}

View File

@@ -8,18 +8,17 @@
*/
#include "endian.xesli"
#define XE_RESOLVE_SOURCE_TYPE uint2_xe
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 8
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -34,25 +33,23 @@ entry_inputs_end_code_begin_compute_xe
if (pixel_index.x >= resolve_info.width_div_8_scaled << 3u) {
return;
}
uint source_address_int2s =
XeEdramOffsetInts(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_4X, false, 1u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale)
>> 1u;
uint source_address = XeEdramOffsetBytes(
uint2_xe(pixel_index.x,
max(pixel_index.y,
resolve_info.half_pixel_offset_fill_source.y)) +
resolve_info.edram_offset_scaled,
resolve_info.edram_base_tiles, true, resolve_info.edram_pitch_tiles,
kXenosMsaaSamples_4X, false, 1u,
XeResolveFirstSampleIndex(resolve_info.sample_select),
resolve_info.resolution_scale);
uint4_xe pixels_01, pixels_23;
pixels_01.xy = array_buffer_load_xe(xe_resolve_edram, source_address_int2s);
pixels_01.zw =
array_buffer_load_xe(xe_resolve_edram, source_address_int2s + 2u);
pixels_23.xy =
array_buffer_load_xe(xe_resolve_edram, source_address_int2s + 4u);
pixels_23.zw =
array_buffer_load_xe(xe_resolve_edram, source_address_int2s + 6u);
pixels_01.xy = byte_buffer_align8_load8_xe(xe_resolve_edram, source_address);
pixels_01.zw = byte_buffer_align8_load8_xe(xe_resolve_edram,
source_address + 0x10u);
pixels_23.xy = byte_buffer_align8_load8_xe(xe_resolve_edram,
source_address + 0x20u);
pixels_23.zw = byte_buffer_align8_load8_xe(xe_resolve_edram,
source_address + 0x30u);
dont_flatten_xe
if (pixel_index.x == 0u &&
resolve_info.half_pixel_offset_fill_source.x != 0u) {
@@ -65,13 +62,12 @@ entry_inputs_end_code_begin_compute_xe
pixels_01.xy = pixels_01.zw;
}
XeResolveSwap4PixelsRedBlue64bpp(resolve_info, pixels_01, pixels_23);
uint dest_address =
XeResolveDestPixelAddress(resolve_info, pixel_index, 3u) >> 4u;
array_buffer_store_xe(
uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 3u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap64(pixels_01, resolve_info.dest_endian_128));
dest_address += XeResolveLocalXAddressXor(2u, 3u) >> 4u;
array_buffer_store_xe(
dest_address += XeResolveLocalXAddressXor(2u, 3u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap64(pixels_23, resolve_info.dest_endian_128));
}

View File

@@ -8,18 +8,17 @@
*/
#include "endian.xesli"
#define XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -36,10 +35,9 @@ entry_inputs_end_code_begin_compute_xe
}
float4_xe pixel_0, pixel_1;
XeResolveLoad2RGBAColors(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
resolve_info,
XeResolveColorCopySourcePixelAddressIntsYHalfPixelOffsetFilling(
XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(
resolve_info,
uint2_xe(max(pixel_index.x,
resolve_info.half_pixel_offset_fill_source.x),
@@ -56,14 +54,13 @@ entry_inputs_end_code_begin_compute_xe
pixel_1 = pixel_0;
}
// Only 32_32_32_32_FLOAT color format is 128bpp.
uint dest_address =
XeResolveDestPixelAddress(resolve_info, pixel_index, 4u) >> 4u;
array_buffer_store_xe(
uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 4u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap128(float_bits_to_uint_xe(pixel_0),
resolve_info.dest_endian_128));
dest_address += XeResolveLocalXAddressXor(1u, 4u) >> 4u;
array_buffer_store_xe(
dest_address += XeResolveLocalXAddressXor(1u, 4u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap128(float_bits_to_uint_xe(pixel_1),
resolve_info.dest_endian_128));

View File

@@ -9,18 +9,17 @@
#include "endian.xesli"
#include "pixel_formats.xesli"
#define XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint2_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align8_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint2_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -37,10 +36,9 @@ entry_inputs_end_code_begin_compute_xe
}
float4_xe pixel_0, pixel_1, pixel_2, pixel_3;
XeResolveLoad4RGBAColors(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
resolve_info,
XeResolveColorCopySourcePixelAddressIntsYHalfPixelOffsetFilling(
XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(
resolve_info, pixel_index),
pixel_0, pixel_1, pixel_2, pixel_3);
uint2_xe packed = XePack16bpp4PixelsInUInt2(
@@ -56,9 +54,8 @@ entry_inputs_end_code_begin_compute_xe
}
packed.x = (packed.x >> 16u) | (packed.x & 0xFFFF0000u);
}
array_buffer_store_xe(
xe_resolve_dest,
XeResolveDestPixelAddress(resolve_info, pixel_index, 1u) >> 3u,
byte_buffer_align8_store8_xe(
xe_resolve_dest, XeResolveDestPixelAddress(resolve_info, pixel_index, 1u),
XeEndianSwap16(packed, resolve_info.dest_endian_128));
}
entry_code_end_compute_xe

View File

@@ -9,18 +9,17 @@
#include "endian.xesli"
#include "pixel_formats.xesli"
#define XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -39,10 +38,9 @@ entry_inputs_end_code_begin_compute_xe
}
float4_xe pixel_0, pixel_1, pixel_2, pixel_3;
XeResolveLoad4RGBAColors(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
resolve_info,
XeResolveColorCopySourcePixelAddressIntsYHalfPixelOffsetFilling(
XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(
resolve_info, pixel_index),
pixel_0, pixel_1, pixel_2, pixel_3);
uint4_xe packed = XePack32bpp4Pixels(pixel_0, pixel_1, pixel_2, pixel_3,
@@ -58,9 +56,8 @@ entry_inputs_end_code_begin_compute_xe
}
packed.x = packed.y;
}
array_buffer_store_xe(
xe_resolve_dest,
XeResolveDestPixelAddress(resolve_info, pixel_index, 2u) >> 4u,
byte_buffer_align16_store16_xe(
xe_resolve_dest, XeResolveDestPixelAddress(resolve_info, pixel_index, 2u),
XeEndianSwap32(packed, resolve_info.dest_endian_128));
}
entry_code_end_compute_xe

View File

@@ -9,18 +9,17 @@
#include "endian.xesli"
#include "pixel_formats.xesli"
#define XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align16_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -37,10 +36,9 @@ entry_inputs_end_code_begin_compute_xe
}
float4_xe pixel_0, pixel_1, pixel_2, pixel_3;
XeResolveLoad4RGBAColors(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
resolve_info,
XeResolveColorCopySourcePixelAddressIntsYHalfPixelOffsetFilling(
XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(
resolve_info, pixel_index),
pixel_0, pixel_1, pixel_2, pixel_3);
uint4_xe packed_01, packed_23;
@@ -57,13 +55,12 @@ entry_inputs_end_code_begin_compute_xe
}
packed_01.xy = packed_01.zw;
}
uint dest_address =
XeResolveDestPixelAddress(resolve_info, pixel_index, 3u) >> 4u;
array_buffer_store_xe(
uint dest_address = XeResolveDestPixelAddress(resolve_info, pixel_index, 3u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap64(packed_01, resolve_info.dest_endian_128));
dest_address += XeResolveLocalXAddressXor(2u, 3u) >> 4u;
array_buffer_store_xe(
dest_address += XeResolveLocalXAddressXor(2u, 3u);
byte_buffer_align16_store16_xe(
xe_resolve_dest, dest_address,
XeEndianSwap64(packed_23, resolve_info.dest_endian_128));
}

View File

@@ -9,18 +9,17 @@
#include "endian.xesli"
#include "pixel_formats.xesli"
#define XE_RESOLVE_COPY_EDRAM_IS_UINT_VECTOR_BUFFER
#define XE_RESOLVE_COPY_EDRAM_BYTE_BUFFER_ALIGNMENT 4
#include "resolve.xesli"
array_buffer_wo_declare_xe(uint2_xe, xe_resolve_dest, set=1, binding=0, u0,
space0)
byte_buffer_align8_wo_declare_xe(xe_resolve_dest, set=1, binding=0, u0, space0)
#define LOCAL_SIZE_X_XE 8
#define LOCAL_SIZE_Y_XE 8
#define LOCAL_SIZE_Z_XE 1
entry_bindings_begin_compute_xe
XE_RESOLVE_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint2_xe, xe_resolve_dest, buffer(1))
byte_buffer_wo_binding_xe(xe_resolve_dest, buffer(1))
entry_binding_next_xe
XE_RESOLVE_COPY_EDRAM_BINDING
entry_bindings_end_inputs_begin_compute_xe
@@ -37,10 +36,9 @@ entry_inputs_end_code_begin_compute_xe
uint2_xe pixel_index = in_global_thread_id_xe.xy << uint2_xe(3u, 0u);
float4_xe pixels_0123, pixels_4567;
XeResolveLoad8RedColors(
pass_uint_vector_buffer_xe(xe_resolve_edram)
pass_next_after_uint_vector_buffer_xe
pass_byte_buffer_xe(xe_resolve_edram) pass_next_after_byte_buffer_xe
resolve_info,
XeResolveColorCopySourcePixelAddressIntsYHalfPixelOffsetFilling(
XeResolveColorCopySourcePixelAddressBytesYHalfPixelOffsetFilling(
resolve_info, pixel_index),
pixels_0123, pixels_4567);
dont_flatten_xe
@@ -56,9 +54,8 @@ entry_inputs_end_code_begin_compute_xe
}
// Convert to R8.
// TODO(Triang3l): Investigate formats 8_A and 8_B.
array_buffer_store_xe(
xe_resolve_dest,
XeResolveDestPixelAddress(resolve_info, pixel_index, 0u) >> 3u,
byte_buffer_align8_store8_xe(
xe_resolve_dest, XeResolveDestPixelAddress(resolve_info, pixel_index, 0u),
uint2_xe(XePackR8G8B8A8UNorm(pixels_0123),
XePackR8G8B8A8UNorm(pixels_4567)));
}

View File

@@ -49,6 +49,21 @@ push_const_begin_xe(b0, space0)
uint xe_texture_load_height_texels;
push_const_end_xe
#define XE_TEXTURE_LOAD_ENTRY(source_byte_buffer_alignment) \
byte_buffer_align16_wo_declare_xe(xe_texture_load_dest, set=0, binding=0, \
u0, space0) \
byte_buffer_align##source_byte_buffer_alignment##_declare_xe( \
xe_texture_load_source, set=1, binding=0, t0, space0) \
entry_bindings_begin_compute_xe \
XE_TEXTURE_LOAD_PUSH_CONST_BINDING \
entry_binding_next_xe \
byte_buffer_wo_binding_xe(xe_texture_load_dest, buffer(1)) \
entry_binding_next_xe \
byte_buffer_binding_xe(xe_texture_load_source, buffer(2)) \
entry_bindings_end_inputs_begin_compute_xe \
entry_in_global_thread_id_xe \
entry_inputs_end_code_begin_compute_xe
#define XE_TEXTURE_LOAD_PUSH_CONST_BINDING push_const_binding_xe(buffer(0))
struct XeTextureLoadInfo {

View File

@@ -9,19 +9,7 @@
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 2 blocks.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -30,24 +18,24 @@ entry_inputs_end_code_begin_compute_xe
if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {
return;
}
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 16u) +
load_info.host_offset) >> 4u);
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 16u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 4u) >> 4u;
array_buffer_store_xe(
XeTextureLoadSourceAddress(load_info, block_index, 4u);
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeEndianSwap32(array_buffer_load_xe(xe_texture_load_source,
block_offset_guest),
XeEndianSwap32(byte_buffer_align16_load16_xe(xe_texture_load_source,
block_offset_guest),
load_info.endian_32));
++block_offset_host;
block_offset_host += 16u;
block_offset_guest +=
XeTextureLoadLocalXAddressXor(1u, 4u, load_info.is_tiled) >> 4u;
array_buffer_store_xe(
XeTextureLoadLocalXAddressXor(1u, 4u, load_info.is_tiled);
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeEndianSwap32(array_buffer_load_xe(xe_texture_load_source,
block_offset_guest),
XeEndianSwap32(byte_buffer_align16_load16_xe(xe_texture_load_source,
block_offset_guest),
load_info.endian_32));
}
entry_code_end_compute_xe

View File

@@ -9,19 +9,7 @@
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 16 blocks passed through an externally provided
// uint4 transformation function (XE_TEXTURE_LOAD_16BPB_TRANSFORM).
@@ -31,24 +19,24 @@ entry_inputs_end_code_begin_compute_xe
if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {
return;
}
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 2u) +
load_info.host_offset) >> 4u);
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 2u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 1u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 1u);
uint4_xe guest_blocks = XeEndianSwap16(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_16BPB_TRANSFORM(guest_blocks));
++block_offset_host;
byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_16BPB_TRANSFORM(guest_blocks));
block_offset_host += 16u;
block_offset_guest +=
XeTextureLoadLocalXAddressXor(8u, 1u, load_info.is_tiled) >> 4u;
XeTextureLoadLocalXAddressXor(8u, 1u, load_info.is_tiled);
guest_blocks = XeEndianSwap16(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_16BPB_TRANSFORM(guest_blocks));
byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_16BPB_TRANSFORM(guest_blocks));
}
entry_code_end_compute_xe

View File

@@ -9,19 +9,7 @@
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 8 blocks passed through an externally provided
// uint4 transformation function (XE_TEXTURE_LOAD_32BPB_TRANSFORM).
@@ -31,24 +19,24 @@ entry_inputs_end_code_begin_compute_xe
if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {
return;
}
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 4u) +
load_info.host_offset) >> 4u);
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 4u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 2u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 2u);
uint4_xe guest_blocks = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_32BPB_TRANSFORM(guest_blocks));
++block_offset_host;
byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_32BPB_TRANSFORM(guest_blocks));
block_offset_host += 16u;
block_offset_guest +=
XeTextureLoadLocalXAddressXor(4u, 2u, load_info.is_tiled) >> 4u;
XeTextureLoadLocalXAddressXor(4u, 2u, load_info.is_tiled);
guest_blocks = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_32BPB_TRANSFORM(guest_blocks));
byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_32BPB_TRANSFORM(guest_blocks));
}
entry_code_end_compute_xe

View File

@@ -9,19 +9,7 @@
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 8 packed 32-bit texels with the externally provided uint4 -> 2x
// uint4 function (XE_TEXTURE_LOAD_32BPB_TO_64BPB) for converting to 64bpb -
@@ -32,26 +20,30 @@ entry_inputs_end_code_begin_compute_xe
if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {
return;
}
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 8u) +
load_info.host_offset) >> 4u);
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 8u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 2u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 2u);
uint4_xe guest_blocks = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
uint4_xe block_0, block_1;
XE_TEXTURE_LOAD_32BPB_TO_64BPB(guest_blocks, block_0, block_1);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host, block_0);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host + 1u, block_1);
byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,
block_0);
byte_buffer_align16_store16_xe(xe_texture_load_dest,
block_offset_host + 0x10u, block_1);
block_offset_guest +=
XeTextureLoadLocalXAddressXor(4u, 2u, load_info.is_tiled) >> 4u;
XeTextureLoadLocalXAddressXor(4u, 2u, load_info.is_tiled);
guest_blocks = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
XE_TEXTURE_LOAD_32BPB_TO_64BPB(guest_blocks, block_0, block_1);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host + 2u, block_0);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host + 3u, block_1);
byte_buffer_align16_store16_xe(xe_texture_load_dest,
block_offset_host + 0x20u, block_0);
byte_buffer_align16_store16_xe(xe_texture_load_dest,
block_offset_host + 0x30u, block_1);
}
entry_code_end_compute_xe

View File

@@ -9,19 +9,7 @@
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 4 blocks passed through an externally provided
// uint4 transformation function (XE_TEXTURE_LOAD_64BPB_TRANSFORM).
@@ -31,24 +19,24 @@ entry_inputs_end_code_begin_compute_xe
if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {
return;
}
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 8u) +
load_info.host_offset) >> 4u);
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 8u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 3u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 3u);
uint4_xe guest_blocks = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_64BPB_TRANSFORM(guest_blocks));
++block_offset_host;
byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_64BPB_TRANSFORM(guest_blocks));
block_offset_host += 16u;
block_offset_guest +=
XeTextureLoadLocalXAddressXor(2u, 3u, load_info.is_tiled) >> 4u;
XeTextureLoadLocalXAddressXor(2u, 3u, load_info.is_tiled);
guest_blocks = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_64BPB_TRANSFORM(guest_blocks));
byte_buffer_align16_store16_xe(xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_64BPB_TRANSFORM(guest_blocks));
}
entry_code_end_compute_xe

View File

@@ -9,19 +9,7 @@
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint2_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint2_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(8)
{
// 1 thread = 16 blocks.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -30,20 +18,20 @@ entry_inputs_end_code_begin_compute_xe
if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {
return;
}
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 1u) +
load_info.host_offset) >> 4u);
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
load_info.size_blocks.y, 1u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 0u) >> 3u;
array_buffer_store_xe(
XeTextureLoadSourceAddress(load_info, block_index, 0u);
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
array_buffer_load_xe(
byte_buffer_align8_load8_xe(xe_texture_load_source,
block_offset_guest),
byte_buffer_align8_load8_xe(
xe_texture_load_source,
block_offset_guest +
(XeTextureLoadLocalXAddressXor(8u, 0u, load_info.is_tiled)
>> 3u))));
XeTextureLoadLocalXAddressXor(8u, 0u, load_info.is_tiled))));
}
entry_code_end_compute_xe

View File

@@ -24,19 +24,7 @@
// II JJ KK LL
// MM NN OO PP
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 4 CTX1 blocks to 16x4 R8G8 texels.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -46,24 +34,24 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
2u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 2u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 3u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 3u);
uint i;
unroll_xe for (i = 0u; i < 2u; ++i) {
if (i != 0u) {
++block_offset_host;
// Odd 2 blocks = even 2 blocks + 32 bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_host += 16u;
block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,
load_info.is_tiled);
}
// Two blocks.
uint4_xe blocks = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source,
block_offset_guest),
load_info.endian_32);
// Unpack the endpoints as 0x00g000r0 0x00G000R0 0x00g100r1 0x00G100R1 so
// they can be multiplied by their weights allowing overflow.
@@ -71,22 +59,22 @@ entry_inputs_end_code_begin_compute_xe
end_8in16.xz = ((blocks.xz >> 8u) & 0xFFu) | ((blocks.xz & 0xFFu) << 16u);
end_8in16.yw = (blocks.xz >> 24u) | (blocks.xz & 0xFF0000u);
uint2_xe weights_high = XeDXTHighColorWeights(blocks.yw);
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high));
dont_flatten_xe if (texel_index_host.y + 1u < load_info.height_texels) {
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + elements_pitch_host,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + load_info.host_pitch,
XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high >> 8u));
dont_flatten_xe if (texel_index_host.y + 2u < load_info.height_texels) {
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 2u * elements_pitch_host,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 2u * load_info.host_pitch,
XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high >> 16u));
dont_flatten_xe
if (texel_index_host.y + 3u < load_info.height_texels) {
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest,
block_offset_host + 3u * elements_pitch_host,
block_offset_host + 3u * load_info.host_pitch,
XeCTX1TwoBlocksRowToR8G8(end_8in16, weights_high >> 24u));
}
}

View File

@@ -10,19 +10,7 @@
#include "pixel_formats.xesli"
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 2 DXN blocks to 8x4 R8G8 texels.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -32,21 +20,20 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
2u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 2u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 4u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 4u);
uint4_xe block_0 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
// Odd block = even block + 32 guest bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_guest += XeTextureLoadLocalXAddressXor(1u, 4u,
load_info.is_tiled);
uint4_xe block_1 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
uint4_xe end_0 = (block_0.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;
uint4_xe end_1 = (block_1.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;
@@ -56,38 +43,38 @@ entry_inputs_end_code_begin_compute_xe
XeDXT5HighAlphaWeights(end_0.zw, weights.y),
XeDXT5HighAlphaWeights(end_1.xy, weights.z),
XeDXT5HighAlphaWeights(end_1.zw, weights.w));
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |
(XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),
XeDXT5RowToA8In16(end_1.xy, weights.z) |
(XeDXT5RowToA8In16(end_1.zw, weights.w) << 8u)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
weights >>= 12u;
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |
(XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),
XeDXT5RowToA8In16(end_1.xy, weights.z) |
(XeDXT5RowToA8In16(end_1.zw, weights.w) << 8u)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
weights = uint4_xe(block_0.yw, block_1.yw) >> 8u;
weights = uint4_xe(XeDXT5HighAlphaWeights(end_0.xy, weights.x),
XeDXT5HighAlphaWeights(end_0.zw, weights.y),
XeDXT5HighAlphaWeights(end_1.xy, weights.z),
XeDXT5HighAlphaWeights(end_1.zw, weights.w));
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |
(XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),
XeDXT5RowToA8In16(end_1.xy, weights.z) |
(XeDXT5RowToA8In16(end_1.zw, weights.w) << 8u)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
weights >>= 12u;
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8In16(end_0.xy, weights.x) |
(XeDXT5RowToA8In16(end_0.zw, weights.y) << 8u),

View File

@@ -10,19 +10,7 @@
#include "pixel_formats.xesli"
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 4 DXT1 blocks to 16x4 R8G8B8A8 texels.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -32,21 +20,20 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
4u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 4u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 3u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 3u);
uint4_xe blocks_01 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
// Odd 2 blocks = even 2 blocks + 32 bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,
load_info.is_tiled);
uint4_xe blocks_23 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
uint4_xe end_8in10_01 =
uint4_xe(XeDXTColorEndpointsToBGR8In10(blocks_01.x),
@@ -66,26 +53,26 @@ entry_inputs_end_code_begin_compute_xe
if (texel_index_host.y + i >= load_info.height_texels) {
break;
}
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
weights >>= 8u;
}
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
is_trans.x ? XeDXT1TransRowToRGBA8(end_8in10_01.xy, weights.x)
: (XeDXTOpaqueRowToRGB8(end_8in10_01.xy, weights.x) |
0xFF000000u));
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 1u,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 0x10u,
is_trans.y ? XeDXT1TransRowToRGBA8(end_8in10_01.zw, weights.y)
: (XeDXTOpaqueRowToRGB8(end_8in10_01.zw, weights.y) |
0xFF000000u));
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 2u,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 0x20u,
is_trans.z ? XeDXT1TransRowToRGBA8(end_8in10_23.xy, weights.z)
: (XeDXTOpaqueRowToRGB8(end_8in10_23.xy, weights.z) |
0xFF000000u));
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 3u,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 0x30u,
is_trans.w ? XeDXT1TransRowToRGBA8(end_8in10_23.zw, weights.w)
: (XeDXTOpaqueRowToRGB8(end_8in10_23.zw, weights.w) |
0xFF000000u));

View File

@@ -10,19 +10,7 @@
#include "pixel_formats.xesli"
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 2 DXT3 blocks to 8x4 R8G8B8A8 texels.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -32,49 +20,49 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
4u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 4u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 4u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 4u);
uint i;
unroll_xe for (i = 0u; i < 2u; ++i) {
if (i != 0u) {
++block_offset_host;
// Odd block = even block + 32 guest bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_host += 16u;
block_offset_guest += XeTextureLoadLocalXAddressXor(1u, 4u,
load_info.is_tiled);
}
uint4_xe block = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source,
block_offset_guest),
load_info.endian_32);
uint2_xe bgr_end_8in10 = XeDXTColorEndpointsToBGR8In10(block.z);
// Sort the color indices so they can be used as weights for the second
// endpoint.
uint bgr_weights = XeDXTHighColorWeights(block.w);
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights) +
((block.xxxx >> uint4_xe(0u, 4u, 8u, 12u)) & 0xFu) * 0x11000000u);
dont_flatten_xe if (texel_index_host.y + 1u < load_info.height_texels) {
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + elements_pitch_host,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + load_info.host_pitch,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 8u) +
((block.xxxx >> uint4_xe(16u, 20u, 24u, 28u)) & 0xFu) *
0x11000000u);
dont_flatten_xe if (texel_index_host.y + 2u < load_info.height_texels) {
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 2u * elements_pitch_host,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 2u * load_info.host_pitch,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 16u) +
((block.yyyy >> uint4_xe(0u, 4u, 8u, 12u)) & 0xFu) *
0x11000000u);
dont_flatten_xe
if (texel_index_host.y + 3u < load_info.height_texels) {
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest,
block_offset_host + 3u * elements_pitch_host,
block_offset_host + 3u * load_info.host_pitch,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 24u) +
((block.yyyy >> uint4_xe(16u, 20u, 24u, 28u)) & 0xFu) *
0x11000000u);

View File

@@ -10,19 +10,7 @@
#include "pixel_formats.xesli"
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 4 DXT3A blocks to 16x4 R8 texels (no need to convert to DXT3
// because the overhead is the same, 2x, but the size must be 4-aligned on
@@ -34,38 +22,37 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
1u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 1u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 3u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 3u);
uint4_xe blocks_01 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
// Odd 2 blocks = even 2 blocks + 32 bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,
load_info.is_tiled);
uint4_xe blocks_23 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeDXT3FourBlocksRowToA8(uint4_xe(blocks_01.xz, blocks_23.xz)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
array_buffer_store_xe(
block_offset_host += load_info.host_pitch;
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeDXT3FourBlocksRowToA8(uint4_xe(blocks_01.xz, blocks_23.xz) >> 16u));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
array_buffer_store_xe(
block_offset_host += load_info.host_pitch;
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeDXT3FourBlocksRowToA8(uint4_xe(blocks_01.yw, blocks_23.yw)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
array_buffer_store_xe(
block_offset_host += load_info.host_pitch;
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeDXT3FourBlocksRowToA8(
uint4_xe(blocks_01.yw, blocks_23.yw) >> 16u));

View File

@@ -9,19 +9,7 @@
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 4 DXT3A-as-1111 blocks to 16x4 16bpp texels passed through an
// externally provided
@@ -34,53 +22,52 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
2u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 2u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 3u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 3u);
uint4_xe blocks_01 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
// Odd 2 blocks = even 2 blocks + 32 bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,
load_info.is_tiled);
uint4_xe blocks_23 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_01.xz));
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 1u,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 16u,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_23.xz));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
uint4_xe high_halfblocks = uint4_xe(blocks_01.xz, blocks_23.xz) >> 16u;
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.xy));
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 1u,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 16u,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.zw));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
array_buffer_store_xe(
block_offset_host += load_info.host_pitch;
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_01.yw));
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 1u,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 16u,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(blocks_23.yw));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
high_halfblocks = uint4_xe(blocks_01.yw, blocks_23.yw) >> 16u;
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.xy));
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 1u,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 16u,
XE_TEXTURE_LOAD_DXT3A_AS_1_1_1_1_TO_16BPP(high_halfblocks.zw));
}
}

View File

@@ -10,19 +10,7 @@
#include "pixel_formats.xesli"
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 2 DXT5 blocks to 8x4 R8G8B8A8 texels.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -32,23 +20,23 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
4u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 4u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 4u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 4u);
uint i;
unroll_xe for (i = 0u; i < 2u; ++i) {
if (i != 0u) {
++block_offset_host;
// Odd block = even block + 32 guest bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_host += 16u;
block_offset_guest += XeTextureLoadLocalXAddressXor(1u, 4u,
load_info.is_tiled);
}
uint4_xe block = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source,
block_offset_guest),
load_info.endian_32);
uint2_xe bgr_end_8in10 = XeDXTColorEndpointsToBGR8In10(block.z);
// Sort the color indices so they can be used as weights for the second
@@ -57,32 +45,32 @@ entry_inputs_end_code_begin_compute_xe
uint2_xe alpha_end = (block.xx >> uint2_xe(0u, 8u)) & 0xFFu;
uint alpha_weights = XeDXT5HighAlphaWeights(
alpha_end, (block.x >> 16u) | ((block.y & 0xFFu) << 16u));
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights) |
((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights)) <<
uint4_xe(24u, 16u, 8u, 0u))
& 0xFF000000u));
dont_flatten_xe if (texel_index_host.y + 1u < load_info.height_texels) {
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + elements_pitch_host,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + load_info.host_pitch,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 8u) |
((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights >> 12u)) <<
uint4_xe(24u, 16u, 8u, 0u))
& 0xFF000000u));
dont_flatten_xe if (texel_index_host.y + 2u < load_info.height_texels) {
alpha_weights = XeDXT5HighAlphaWeights(alpha_end, block.y >> 8u);
array_buffer_store_xe(
xe_texture_load_dest, block_offset_host + 2u * elements_pitch_host,
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host + 2u * load_info.host_pitch,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 16u) |
((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights)) <<
uint4_xe(24u, 16u, 8u, 0u))
& 0xFF000000u));
dont_flatten_xe
if (texel_index_host.y + 3u < load_info.height_texels) {
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest,
block_offset_host + 3u * elements_pitch_host,
block_offset_host + 3u * load_info.host_pitch,
XeDXTOpaqueRowToRGB8(bgr_end_8in10, bgr_weights >> 24u) |
((uint_x4_xe(XeDXT5RowToA8(alpha_end, alpha_weights >> 12u)) <<
uint4_xe(24u, 16u, 8u, 0u))

View File

@@ -10,19 +10,7 @@
#include "pixel_formats.xesli"
#include "texture_load.xesli"
array_buffer_wo_declare_xe(uint4_xe, xe_texture_load_dest, set=0, binding=0, u0,
space0)
array_buffer_declare_xe(uint4_xe, xe_texture_load_source, set=1, binding=0, t0,
space0)
entry_bindings_begin_compute_xe
XE_TEXTURE_LOAD_PUSH_CONST_BINDING
entry_binding_next_xe
array_buffer_wo_binding_xe(uint4_xe, xe_texture_load_dest, buffer(1))
entry_binding_next_xe
array_buffer_binding_xe(uint4_xe, xe_texture_load_source, buffer(2))
entry_bindings_end_inputs_begin_compute_xe
entry_in_global_thread_id_xe
entry_inputs_end_code_begin_compute_xe
XE_TEXTURE_LOAD_ENTRY(16)
{
// 1 thread = 4 DXT5A blocks to 16x4 R8 texels.
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
@@ -32,21 +20,20 @@ entry_inputs_end_code_begin_compute_xe
return;
}
uint3_xe texel_index_host = block_index << uint3_xe(2u, 2u, 0u);
uint block_offset_host = uint(
(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch, load_info.height_texels,
1u) +
load_info.host_offset) >> 4u);
uint elements_pitch_host = load_info.host_pitch >> 4u;
uint block_offset_host =
load_info.host_offset +
uint(XeTextureHostLinearOffset(int3_xe(texel_index_host),
load_info.host_pitch,
load_info.height_texels, 1u));
uint block_offset_guest =
XeTextureLoadSourceAddress(load_info, block_index, 3u) >> 4u;
XeTextureLoadSourceAddress(load_info, block_index, 3u);
uint4_xe blocks_01 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
// Odd 2 blocks = even 2 blocks + 32 bytes when tiled.
block_offset_guest += load_info.is_tiled ? 2u : 1u;
block_offset_guest += XeTextureLoadLocalXAddressXor(2u, 3u,
load_info.is_tiled);
uint4_xe blocks_23 = XeEndianSwap32(
array_buffer_load_xe(xe_texture_load_source, block_offset_guest),
byte_buffer_align16_load16_xe(xe_texture_load_source, block_offset_guest),
load_info.endian_32);
uint4_xe end_01 = (blocks_01.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;
uint4_xe end_23 = (blocks_23.xxzz >> uint4_xe(0u, 8u, 0u, 8u)) & 0xFFu;
@@ -57,38 +44,38 @@ entry_inputs_end_code_begin_compute_xe
XeDXT5HighAlphaWeights(end_01.zw, weights.y),
XeDXT5HighAlphaWeights(end_23.xy, weights.z),
XeDXT5HighAlphaWeights(end_23.zw, weights.w));
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),
XeDXT5RowToA8(end_01.zw, weights.y),
XeDXT5RowToA8(end_23.xy, weights.z),
XeDXT5RowToA8(end_23.zw, weights.w)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
weights >>= 12u;
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),
XeDXT5RowToA8(end_01.zw, weights.y),
XeDXT5RowToA8(end_23.xy, weights.z),
XeDXT5RowToA8(end_23.zw, weights.w)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
weights = uint4_xe(blocks_01.yw, blocks_23.yw) >> 8u;
weights = uint4_xe(XeDXT5HighAlphaWeights(end_01.xy, weights.x),
XeDXT5HighAlphaWeights(end_01.zw, weights.y),
XeDXT5HighAlphaWeights(end_23.xy, weights.z),
XeDXT5HighAlphaWeights(end_23.zw, weights.w));
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),
XeDXT5RowToA8(end_01.zw, weights.y),
XeDXT5RowToA8(end_23.xy, weights.z),
XeDXT5RowToA8(end_23.zw, weights.w)));
dont_flatten_xe if (++texel_index_host.y < load_info.height_texels) {
block_offset_host += elements_pitch_host;
block_offset_host += load_info.host_pitch;
weights >>= 12u;
array_buffer_store_xe(
byte_buffer_align16_store16_xe(
xe_texture_load_dest, block_offset_host,
uint4_xe(XeDXT5RowToA8(end_01.xy, weights.x),
XeDXT5RowToA8(end_01.zw, weights.y),

View File

@@ -23,7 +23,7 @@ cbuffer xe_system_cbuffer : register(b0) {
uint4 xe_texture_swizzled_signs[2];
uint xe_textures_resolved;
uint xe_textures_resolution_scaled;
uint2 xe_sample_count_log2;
float xe_alpha_test_reference;