From 44b22ca441e2c9adf9edc718a81d57352cfbb057 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 20 Oct 2015 15:23:56 -0700 Subject: [PATCH] nir/spirv: Handle SpvExecutionMode --- src/glsl/nir/spirv_to_nir.c | 86 ++++++++++++++++++++++++++++- src/glsl/nir/spirv_to_nir_private.h | 1 + 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/src/glsl/nir/spirv_to_nir.c b/src/glsl/nir/spirv_to_nir.c index 819109385ee..52bc335637f 100644 --- a/src/glsl/nir/spirv_to_nir.c +++ b/src/glsl/nir/spirv_to_nir.c @@ -780,13 +780,18 @@ var_decoration_cb(struct vtn_builder *b, struct vtn_value *val, int member, var->data.descriptor_set = dec->literals[0]; break; case SpvDecorationBuiltIn: { + SpvBuiltIn builtin = dec->literals[0]; + nir_variable_mode mode; - vtn_get_builtin_location(dec->literals[0], &var->data.location, - &mode); + vtn_get_builtin_location(builtin, &var->data.location, &mode); var->data.explicit_location = true; var->data.mode = mode; if (mode == nir_var_shader_in || mode == nir_var_system_value) var->data.read_only = true; + + if (builtin == SpvBuiltInPosition || builtin == SpvBuiltInSamplePosition) + var->data.origin_upper_left = b->origin_upper_left; + b->builtins[dec->literals[0]] = var; break; } @@ -834,6 +839,9 @@ get_builtin_variable(struct vtn_builder *b, var->data.location = location; var->data.explicit_location = true; + if (builtin == SpvBuiltInPosition || builtin == SpvBuiltInSamplePosition) + var->data.origin_upper_left = b->origin_upper_left; + b->builtins[builtin] = var; } @@ -2403,7 +2411,79 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, break; case SpvOpExecutionMode: - /* TODO */ + assert(b->entry_point == &b->values[w[1]]); + + switch((SpvExecutionMode)w[2]) { + case SpvExecutionModeOriginUpperLeft: + case SpvExecutionModeOriginLowerLeft: + b->origin_upper_left = (w[2] == SpvExecutionModeOriginUpperLeft); + break; + + case SpvExecutionModeEarlyFragmentTests: + b->shader->info.fs.early_fragment_tests = true; + break; + + case SpvExecutionModeInvocations: + b->shader->info.gs.invocations = w[3]; + break; + + case SpvExecutionModeDepthReplacing: + b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_ANY; + break; + case SpvExecutionModeDepthGreater: + b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_GREATER; + break; + case SpvExecutionModeDepthLess: + b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_LESS; + break; + case SpvExecutionModeDepthUnchanged: + b->shader->info.fs.depth_layout = FRAG_DEPTH_LAYOUT_UNCHANGED; + break; + + case SpvExecutionModeLocalSize: + b->shader->info.cs.local_size[0] = w[3]; + b->shader->info.cs.local_size[1] = w[4]; + b->shader->info.cs.local_size[2] = w[5]; + break; + case SpvExecutionModeLocalSizeHint: + break; /* Nothing do do with this */ + + case SpvExecutionModeOutputVertices: + b->shader->info.gs.vertices_out = w[3]; + break; + + case SpvExecutionModeInputPoints: + case SpvExecutionModeInputLines: + case SpvExecutionModeInputLinesAdjacency: + case SpvExecutionModeInputTriangles: + case SpvExecutionModeInputTrianglesAdjacency: + case SpvExecutionModeInputQuads: + case SpvExecutionModeInputIsolines: + case SpvExecutionModeOutputPoints: + case SpvExecutionModeOutputLineStrip: + case SpvExecutionModeOutputTriangleStrip: + assert(!"TODO: Add geometry metadata"); + break; + + case SpvExecutionModeSpacingEqual: + case SpvExecutionModeSpacingFractionalEven: + case SpvExecutionModeSpacingFractionalOdd: + case SpvExecutionModeVertexOrderCw: + case SpvExecutionModeVertexOrderCcw: + case SpvExecutionModePointMode: + assert(!"TODO: Add tessellation metadata"); + break; + + case SpvExecutionModePixelCenterInteger: + case SpvExecutionModeXfb: + assert(!"Unhandled execution mode"); + break; + + case SpvExecutionModeVecTypeHint: + case SpvExecutionModeContractionOff: + case SpvExecutionModeIndependentForwardProgress: + break; /* OpenCL */ + } break; case SpvOpString: diff --git a/src/glsl/nir/spirv_to_nir_private.h b/src/glsl/nir/spirv_to_nir_private.h index decceff65a6..96044b05aac 100644 --- a/src/glsl/nir/spirv_to_nir_private.h +++ b/src/glsl/nir/spirv_to_nir_private.h @@ -178,6 +178,7 @@ struct vtn_builder { struct vtn_value *values; SpvExecutionModel execution_model; + bool origin_upper_left; struct vtn_value *entry_point; struct vtn_function *func; -- 2.30.2