From: Kenneth Graunke Date: Sat, 15 Oct 2016 03:08:47 +0000 (-0700) Subject: i965: Fix gl_InvocationID in dual object GS where invocations == 1. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9f677d6541741af483c22f29e81f0d883f86028a;p=mesa.git 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 Reviewed-by: Anuj Phogat --- 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 c5886d4fd0f..59c7d21d9b6 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");