Hi, the series sets gl_BaseVertex to zero for gl*DrawArrays* in i965. Previously, its value was the value passed as <first> in the non-indexed draw call. This was convinient because the gl_VertexID was calculated as gl_VertexIDBaseZero + gl_BaseVertex.
However, as gl_BaseVertex must be zero for non-indexed draw calls, this calculation is broken. Apart from setting the basevertex to zero in i965, the following patches add a new VS system value which will contain <first> or <basevertex> as needed to make the gl_VertexID calculation right. The relevant bits of the OpenGL 4.6 specification involved here are: * 11.1.3.9 Shader Inputs "gl_BaseVertex holds the integer value passed to the baseVertex parameter to the command that resulted in the current shader invocation. In the case where the command has no baseVertex parameter, the value of gl_BaseVertex is zero." "gl_VertexID holds the integer index i implicitly passed by DrawArrays or one of the other drawing commands defined in section 10.4." * 10.4. Drawing Commands Using Vertex Arrays: - Page 352: "The index of any element transferred to the GL by DrawArraysOneInstance is referred to as its vertex ID, and may be read by a vertex shader as gl_VertexID. The vertex ID of the ith element transferred is first + i." - Page 355: "The index of any element transferred to the GL by DrawElementsOneInstance is referred to as its vertex ID, and may be read by a vertex shader as gl_VertexID. The vertex ID of the ith element transferred is the sum of basevertex and the value stored in the currently bound element array buffer at offset indices + i." Regards, Antia. Antia Puentes (5): compiler: Add new system value SYSTEM_VALUE_BASE_VERTEX_ID nir: Add SYSTEM_VALUE_BASE_VERTEX_ID instrinsics i965: emit basevertexid as a vertex element component i965: gl_BaseVertex must be zero for non-indexed draw calls intel/compiler: implement the basevertex(id) load intrinsics Neil Roberts (4): intel/compiler: Add a uses_basevertexid flag nir: Offset vertex_id by base_vertex_id instead of base_vertex i965: Let nir lower gl_VertexID instead of the linker spirv: Lower BaseVertex to BASE_VERTEX_ID instead of BASE_VERTEX src/compiler/nir/nir.c | 4 +++ src/compiler/nir/nir_gather_info.c | 1 + src/compiler/nir/nir_intrinsics.h | 1 + src/compiler/nir/nir_lower_system_values.c | 2 +- src/compiler/shader_enums.c | 1 + src/compiler/shader_enums.h | 15 +++++++++++ src/compiler/spirv/vtn_variables.c | 2 +- src/intel/compiler/brw_compiler.h | 1 + src/intel/compiler/brw_nir.c | 12 ++++++--- src/intel/compiler/brw_vec4.cpp | 18 ++++++++----- src/intel/vulkan/genX_cmd_buffer.c | 8 +++--- src/intel/vulkan/genX_pipeline.c | 4 +-- src/mesa/drivers/dri/i965/brw_context.c | 3 ++- src/mesa/drivers/dri/i965/brw_context.h | 36 ++++++++++++++++++------- src/mesa/drivers/dri/i965/brw_draw.c | 33 ++++++++++++++++------- src/mesa/drivers/dri/i965/brw_draw_upload.c | 13 ++++----- src/mesa/drivers/dri/i965/genX_state_upload.c | 39 +++++++++++++++------------ 17 files changed, 132 insertions(+), 61 deletions(-) -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev