mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 11:00:11 +01:00
softpipe: Implement ATOMFADD and enable cap TGSI_ATOMFADD
This enables the following piglits with PASS:
nv_shader_atomic_float/execution/
shared-atomicadd-float
shared-atomicexchange-float
ssbo-atomicadd-float
ssbo-atomicexchange-float
v2: Minimize the patch by using type punning (Eric Anholt)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
4f153fcd5c
commit
33d9b9436c
2 changed files with 18 additions and 10 deletions
|
|
@ -155,14 +155,14 @@ sp_tgsi_store(const struct tgsi_buffer *buffer,
|
|||
* Implement atomic operations on unsigned integers.
|
||||
*/
|
||||
static void
|
||||
handle_op_uint(const struct pipe_shader_buffer *bview,
|
||||
bool just_read,
|
||||
unsigned char *data_ptr,
|
||||
uint qi,
|
||||
enum tgsi_opcode opcode,
|
||||
unsigned writemask,
|
||||
float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE],
|
||||
float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE])
|
||||
handle_op_atomic(const struct pipe_shader_buffer *bview,
|
||||
bool just_read,
|
||||
unsigned char *data_ptr,
|
||||
uint qi,
|
||||
enum tgsi_opcode opcode,
|
||||
unsigned writemask,
|
||||
float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE],
|
||||
float rgba2[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE])
|
||||
{
|
||||
uint c;
|
||||
const struct util_format_description *format_desc = util_format_description(PIPE_FORMAT_R32_UINT);
|
||||
|
|
@ -260,6 +260,13 @@ handle_op_uint(const struct pipe_shader_buffer *bview,
|
|||
((uint32_t *)rgba[c])[qi] = dst_x;
|
||||
}
|
||||
break;
|
||||
case TGSI_OPCODE_ATOMFADD:
|
||||
for (c = 0; c < 4; c++) {
|
||||
float temp = uif(sdata[c]);
|
||||
sdata[c] = fui(temp + rgba[c][qi]);
|
||||
rgba[c][qi] = temp;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(!"Unexpected TGSI opcode in sp_tgsi_op");
|
||||
break;
|
||||
|
|
@ -324,8 +331,8 @@ sp_tgsi_op(const struct tgsi_buffer *buffer,
|
|||
data_ptr = (unsigned char *)spr->data + bview->buffer_offset + s_coord;
|
||||
/* we should see atomic operations on r32 formats */
|
||||
|
||||
handle_op_uint(bview, just_read, data_ptr, j,
|
||||
opcode, params->writemask, rgba, rgba2);
|
||||
handle_op_atomic(bview, just_read, data_ptr, j,
|
||||
opcode, params->writemask, rgba, rgba2);
|
||||
}
|
||||
return;
|
||||
fail_write_all_zero:
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
return 1;
|
||||
case PIPE_CAP_SHADER_STENCIL_EXPORT:
|
||||
return 1;
|
||||
case PIPE_CAP_TGSI_ATOMFADD:
|
||||
case PIPE_CAP_TGSI_INSTANCEID:
|
||||
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
|
||||
case PIPE_CAP_START_INSTANCE:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue