diff options
author | Kenneth Graunke <kenneth@whitecape.org> | 2016-10-14 20:08:47 -0700 |
---|---|---|
committer | Kenneth Graunke <kenneth@whitecape.org> | 2016-10-17 20:22:02 -0700 |
commit | 9f677d6541741af483c22f29e81f0d883f86028a (patch) | |
tree | a65bcc402e33569590e298ae3f96c18ec5e46d83 /src/mesa/drivers | |
parent | 52904ba85c7e1e3092601e3497bfbc246b00b84a (diff) | |
download | external_mesa3d-9f677d6541741af483c22f29e81f0d883f86028a.zip external_mesa3d-9f677d6541741af483c22f29e81f0d883f86028a.tar.gz external_mesa3d-9f677d6541741af483c22f29e81f0d883f86028a.tar.bz2 |
i965: Fix gl_InvocationID in dual object GS where invocations == 1.
dEQP-GLES31.functional.geometry_shading.instanced.geometry_1_invocations
draws using a geometry shader that specifies
layout(points, invocations = 1) in;
and then uses gl_InvocationID. According to the Haswell PRM, the
"GS Instance ID 0" (and 1) thread payload fields are undefined in
dual object mode:
"If 'dispatch mode' is DUAL_OBJECT this field is not valid."
But there's no point in using them - if there's only one invocation,
the ID will be 0. So just load a constant.
Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp index c5886d4..59c7d21 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_gs_visitor.cpp @@ -59,7 +59,10 @@ vec4_gs_visitor::make_reg_for_system_value(int location) switch (location) { case SYSTEM_VALUE_INVOCATION_ID: this->current_annotation = "initialize gl_InvocationID"; - emit(GS_OPCODE_GET_INSTANCE_ID, *reg); + if (gs_prog_data->invocations > 1) + emit(GS_OPCODE_GET_INSTANCE_ID, *reg); + else + emit(MOV(*reg, brw_imm_ud(0))); break; default: unreachable("not reached"); |