glsl: Add unary operation ir_unop_f2u.
Previously, we performed conversions from float->uint by a two step process: float->int->uint. However, on platforms that use saturating conversions (e.g. i965), this didn't work, because if the source value was larger than the maximum representable int (0x7fffffff), then converting it to an int would clamp it to 0x7fffffff. This patch just adds the new opcode; further patches will adapt optimization passes and back-ends to use it, and then finally the ast_to_hir logic will be modified to emit the new opcode. Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -299,6 +299,7 @@ ir_expression::ir_expression(int op, ir_rvalue *op0)
|
||||
break;
|
||||
|
||||
case ir_unop_i2u:
|
||||
case ir_unop_f2u:
|
||||
case ir_unop_bitcast_f2u:
|
||||
this->type = glsl_type::get_instance(GLSL_TYPE_UINT,
|
||||
op0->type->vector_elements, 1);
|
||||
@@ -428,6 +429,7 @@ static const char *const operator_strs[] = {
|
||||
"exp2",
|
||||
"log2",
|
||||
"f2i",
|
||||
"f2u",
|
||||
"i2f",
|
||||
"f2b",
|
||||
"b2f",
|
||||
|
Reference in New Issue
Block a user