Merge remote-tracking branch 'xenia-master/master' into canary_experimental
This commit is contained in:
@@ -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_
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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) |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user