Reviewed-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com>

On Tue, 2017-09-05 at 14:41 +0200, Iago Toral Quiroga wrote:
> The spec has special rules for querying buffer offsets and sizes
> when BindBufferBase is used, described  in the OpenGL 4.6 spec,
> section 6.8 Buffer Object State:
> 
>    "To query the starting offset or size of the range of a buffer
>     object binding in an indexed array, call GetInteger64i_v with
>     target set to respectively the starting offset or binding size
>     name from table 6.5 for that array. Index must be in the range
>     zero to the number of bind points supported minus one. If the
>     starting offset or size was not specified when the buffer object
>     was bound (e.g. if it was bound with BindBufferBase), or if no
>     buffer object is bound to the target array at index, zero is
>     returned."
> 
> Transform feedback buffer queries should follow the same rules, since
> it is the same case for them. There is a CTS test for this.
> 
> Fixes:
> KHR-GL45.direct_state_access.xfb_buffers
> ---
>  src/mesa/main/transformfeedback.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/src/mesa/main/transformfeedback.c
> b/src/mesa/main/transformfeedback.c
> index befc74444c..a5ea2a5eb7 100644
> --- a/src/mesa/main/transformfeedback.c
> +++ b/src/mesa/main/transformfeedback.c
> @@ -1402,12 +1402,34 @@ _mesa_GetTransformFeedbacki64_v(GLuint xfb,
> GLenum pname, GLuint index,
>        return;
>     }
>  
> +   /**
> +    * This follows the same general rules used for BindBufferBase:
> +    *
> +    *   "To query the starting offset or size of the range of a
> buffer
> +    *    object binding in an indexed array, call GetInteger64i_v
> with
> +    *    target set to respectively the starting offset or binding
> size
> +    *    name from table 6.5 for that array. Index must be in the
> range
> +    *    zero to the number of bind points supported minus one. If
> the
> +    *    starting offset or size was not specified when the buffer
> object
> +    *    was bound (e.g. if it was bound with BindBufferBase), or if
> no
> +    *    buffer object is bound to the target array at index, zero
> is
> +    *    returned."
> +    */
> +   if (obj->RequestedSize[index] == 0 &&
> +       (pname == GL_TRANSFORM_FEEDBACK_BUFFER_START ||
> +        pname == GL_TRANSFORM_FEEDBACK_BUFFER_SIZE)) {
> +      *param = 0;
> +      return;
> +   }
> +
>     compute_transform_feedback_buffer_sizes(obj);
>     switch(pname) {
>     case GL_TRANSFORM_FEEDBACK_BUFFER_START:
> +      assert(obj->RequestedSize[index] > 0);
>        *param = obj->Offset[index];
>        break;
>     case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
> +      assert(obj->RequestedSize[index] > 0);
>        *param = obj->Size[index];
>        break;
>     default:

Attachment: signature.asc
Description: This is a digitally signed message part

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to