From 32cc44150d9664fbae8bd4d0764da48bf9f21d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3zef=20Kucia?= Date: Wed, 28 Jun 2017 12:28:09 +0200 Subject: [PATCH] libs/vkd3d-shader: Translate bitfield instructions. --- libs/vkd3d-shader/spirv.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 56c3c188..777bda5c 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -1751,15 +1751,16 @@ static SpvOp vkd3d_dxbc_compiler_map_alu_instruction(const struct vkd3d_shader_i } alu_ops[] = { - {VKD3DSIH_ADD, SpvOpFAdd}, - {VKD3DSIH_AND, SpvOpBitwiseAnd}, - {VKD3DSIH_DIV, SpvOpFDiv}, - {VKD3DSIH_FTOI, SpvOpConvertFToS}, - {VKD3DSIH_FTOU, SpvOpConvertFToU}, - {VKD3DSIH_IADD, SpvOpIAdd}, - {VKD3DSIH_ITOF, SpvOpConvertSToF}, - {VKD3DSIH_MUL, SpvOpFMul}, - {VKD3DSIH_UTOF, SpvOpConvertUToF}, + {VKD3DSIH_ADD, SpvOpFAdd}, + {VKD3DSIH_AND, SpvOpBitwiseAnd}, + {VKD3DSIH_BFREV, SpvOpBitReverse}, + {VKD3DSIH_DIV, SpvOpFDiv}, + {VKD3DSIH_FTOI, SpvOpConvertFToS}, + {VKD3DSIH_FTOU, SpvOpConvertFToU}, + {VKD3DSIH_IADD, SpvOpIAdd}, + {VKD3DSIH_ITOF, SpvOpConvertSToF}, + {VKD3DSIH_MUL, SpvOpFMul}, + {VKD3DSIH_UTOF, SpvOpConvertUToF}, }; unsigned int i; @@ -1964,7 +1965,15 @@ static void vkd3d_dxbc_compiler_emit_bitfield_instruction(struct vkd3d_dxbc_comp type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_UINT, 1); mask_id = vkd3d_dxbc_compiler_get_constant_uint(compiler, 0x1f); - op = SpvOpBitFieldInsert; + switch (instruction->handler_idx) + { + case VKD3DSIH_BFI: op = SpvOpBitFieldInsert; break; + case VKD3DSIH_IBFE: op = SpvOpBitFieldSExtract; break; + case VKD3DSIH_UBFE: op = SpvOpBitFieldUExtract; break; + default: + ERR("Unexpected instruction %#x.\n", instruction->handler_idx); + return; + } for (i = 0; i < VKD3D_VEC4_SIZE; ++i) { @@ -2166,6 +2175,7 @@ void vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler break; case VKD3DSIH_ADD: case VKD3DSIH_AND: + case VKD3DSIH_BFREV: case VKD3DSIH_DIV: case VKD3DSIH_FTOI: case VKD3DSIH_FTOU: @@ -2195,6 +2205,8 @@ void vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler vkd3d_dxbc_compiler_emit_comparison_instruction(compiler, instruction); break; case VKD3DSIH_BFI: + case VKD3DSIH_IBFE: + case VKD3DSIH_UBFE: vkd3d_dxbc_compiler_emit_bitfield_instruction(compiler, instruction); break; case VKD3DSIH_IF: