On 2015-10-30 00:16:43, Iago Toral wrote: > On Wed, 2015-10-14 at 13:46 -0700, Jordan Justen wrote: > > There is a discrepancy between the ARB_compute_shader specification, > > and the OpenGL 4.3 and OpenGLES 3.1 specifications. With regards to > > the indirect dispatch parameter, unsupported value errors should > > return INVALID_VALUE according to the main specifications, whereas the > > extension specification indicated INVALID_OPERATION should be > > returned. > > > > Here we update the code to match the main specifications, and update > > the citations use the main specification rather than the extension > > specification. > > > > Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> > > --- > > Fixes ES31-CTS.compute_shader.api-indirect > > > > src/mesa/main/api_validate.c | 37 ++++++++++++++++++++++++++----------- > > 1 file changed, 26 insertions(+), 11 deletions(-) > > > > diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c > > index a46c194..c286945 100644 > > --- a/src/mesa/main/api_validate.c > > +++ b/src/mesa/main/api_validate.c > > @@ -895,6 +895,11 @@ check_valid_to_compute(struct gl_context *ctx, const > > char *function) > > return false; > > } > > > > + /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders: > > + * > > + * "An INVALID_OPERATION error is generated if there is no active > > program > > + * for the compute shader stage." > > + */ > > prog = ctx->Shader.CurrentProgram[MESA_SHADER_COMPUTE]; > > if (prog == NULL || prog->_LinkedShaders[MESA_SHADER_COMPUTE] == NULL) { > > _mesa_error(ctx, GL_INVALID_OPERATION, > > @@ -917,6 +922,12 @@ _mesa_validate_DispatchCompute(struct gl_context *ctx, > > return GL_FALSE; > > > > for (i = 0; i < 3; i++) { > > + /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute > > Shaders: > > + * > > + * "An INVALID_VALUE error is generated if any of num_groups_x, > > + * num_groups_y and num_groups_z are greater than or equal to the > > + * maximum work group count for the corresponding dimension." > > + */ > > if (num_groups[i] > ctx->Const.MaxComputeWorkGroupCount[i]) { > > This should be >= according to that spec quotation.
Wow. Good catch, except, I am fairly certain that this must be a spec error. 'greater than' instead of 'greater than or equal' is more consistent with the usage and other parts of the spec. Unfortunately, this wording exists in the OpenGL 4.3 - 4.5 specs. What a mess. :) Here is some contradicting text from the DispatchCompute section of 4.3 spec: "num groups x, num groups y and num groups z specify the number of local work groups that will be dispatched in the X, Y and Z dimensions, respectively." "The maximum number of work groups that may be dispatched at one time may be determined by calling GetIntegeri v with target set to MAX_COMPUTE_WORK_GROUP_COUNT and index set to zero, one, or two, representing the X, Y, and Z dimensions respectively." So, it is saying that MAX_COMPUTE_WORK_GROUP_COUNT is the maximum values. Thus being 'equal' to the max should be valid. And, then in the DispatchComputeIndirect section of the 4.3 spec: "If any of num groups x, num groups y or num groups z is greater than the value of MAX_COMPUTE_WORK_GROUP_COUNT for the corresponding dimension then the results are undefined." Note 'greater than' rather than 'greater than or equal'. I'll ask the spec author about it, but in the meantime, I think I should just skip adding this spec citation, or instead use the one from above that starts with "The maximum number of " ... What do you think? > > > _mesa_error(ctx, GL_INVALID_VALUE, > > "glDispatchCompute(num_groups_%c)", 'x' + i); > > @@ -937,24 +948,33 @@ valid_dispatch_indirect(struct gl_context *ctx, > > if (!check_valid_to_compute(ctx, name)) > > return GL_FALSE; > > > > - /* From the ARB_compute_shader specification: > > + /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders: > > * > > - * "An INVALID_OPERATION error is generated [...] if <indirect> is less > > - * than zero or not a multiple of the size, in basic machine units, of > > - * uint." > > + * "An INVALID_VALUE error is generated if indirect is negative or is > > not a > > + * multiple of four." > > + * Note that the OpenGLES 3.1 specification matches this, but this is > > + * different than the extension specification which has a return of > > + * INVALID_OPERATION instead. > > However, I read the following: > > "void DispatchComputeIndirect(intptr indirect);" > (...) > The error INVALID_VALUE is generated if <indirect> is less than zero or > is not a multiple of four.(...)" > > and then again: > > "Errors: > (...) > INVALID_VALUE is generated by DispatchComputeIndirect if <indirect> is > less than zero or not a multiple of four." > > From: > https://www.opengl.org/registry/specs/ARB/compute_shader.txt Hmm, so the ARB_compute_shader spec is inconsistent with itself. :( How about I just drop the note that the ARB_compute_shader contradicting the OpenGL spec? In other words: - /* From the ARB_compute_shader specification: + /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders: * - * "An INVALID_OPERATION error is generated [...] if <indirect> is less - * than zero or not a multiple of the size, in basic machine units, of - * uint." + * "An INVALID_VALUE error is generated if indirect is negative or is not a + * multiple of four." Thanks, -Jordan > > > */ > > if ((GLintptr)indirect & (sizeof(GLuint) - 1)) { > > - _mesa_error(ctx, GL_INVALID_OPERATION, > > + _mesa_error(ctx, GL_INVALID_VALUE, > > "%s(indirect is not aligned)", name); > > return GL_FALSE; > > } > > > > if ((GLintptr)indirect < 0) { > > - _mesa_error(ctx, GL_INVALID_OPERATION, > > + _mesa_error(ctx, GL_INVALID_VALUE, > > "%s(indirect is less than zero)", name); > > return GL_FALSE; > > } > > > > + /* From the OpenGL 4.3 Core Specification, Chapter 19, Compute Shaders: > > + * > > + * "An INVALID_OPERATION error is generated if no buffer is bound to the > > + * DRAW_INDIRECT_BUFFER binding, or if the command would source data > > + * beyond the end of the buffer object." > > + */ > > if (!_mesa_is_bufferobj(ctx->DispatchIndirectBuffer)) { > > _mesa_error(ctx, GL_INVALID_OPERATION, > > "%s: no buffer bound to DISPATCH_INDIRECT_BUFFER", name); > > @@ -967,11 +987,6 @@ valid_dispatch_indirect(struct gl_context *ctx, > > return GL_FALSE; > > } > > > > - /* From the ARB_compute_shader specification: > > - * > > - * "An INVALID_OPERATION error is generated if this command sources data > > - * beyond the end of the buffer object [...]" > > - */ > > if (ctx->DispatchIndirectBuffer->Size < end) { > > _mesa_error(ctx, GL_INVALID_OPERATION, > > "%s(DISPATCH_INDIRECT_BUFFER too small)", name); > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev