On Mon, Aug 13, 2012 at 7:23 PM, Ian Romanick <[email protected]> wrote:
> From: Ian Romanick <[email protected]>
>
> These are part of GL_ARB_invalidate_subdata (but not OpenGL ES 3.0).
>
> Signed-off-by: Ian Romanick <[email protected]>
> ---
>  src/mesa/main/bufferobj.c |   93 
> +++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 93 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index 396408f..9da2663 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -2200,6 +2200,94 @@ _mesa_BindBufferBase(GLenum target, GLuint index, 
> GLuint buffer)
>     }
>  }
>
> +static void GLAPIENTRY
> +_mesa_InvalidateBufferSubData(GLuint buffer, GLintptr offset,
> +                              GLsizeiptr length)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_buffer_object *bufObj;
> +   const GLintptr end = offset + length;
> +
> +   bufObj = _mesa_lookup_bufferobj(ctx, buffer);
> +   if (!bufObj) {
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glInvalidateBufferSubData(name = 0x%x) invalid object",
> +                  buffer);
> +      return;
> +   }
> +
> +   /* The GL_ARB_invalidate_subdata spec says:
> +    *
> +    *     "An INVALID_VALUE error is generated if <offset> or <length> is
> +    *     negative, or if <offset> + <length> is greater than the value of
> +    *     BUFFER_SIZE."
> +    */
> +   if (end < 0 || end > bufObj->Size) {
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glInvalidateBufferSubData(invalid offset or length)");
> +      return;
> +   }
> +
> +   /* The GL_ARB_invalidate_subdata spec says:
> +    *
> +    *     "An INVALID_OPERATION error is generated if the buffer is currently
> +    *     mapped by MapBuffer, or if the invalidate range intersects the 
> range
> +    *     currently mapped by MapBufferRange."
> +    */
> +   if (bufObj->Pointer) {

We have a _mesa_bufferobj_mapped() helper in bufferobj.h that could be
used there.
Same thing in another place below.


> +      const GLintptr mapEnd = bufObj->Offset + bufObj->Length;
> +
> +      /* The regions do not overlap if and only if the end of the discard
> +       * region is before the mapped region or the start of the discard 
> region
> +       * is after the mapped region.
> +       */
> +      if (!(end <= bufObj->Offset || offset > mapEnd)) {
> +         _mesa_error(ctx, GL_INVALID_OPERATION,
> +                     "glInvalidateBufferSubData(intersection with mapped "
> +                     "range)");
> +         return;
> +      }
> +   }
> +
> +   /* We don't actually do anything for this yet.  Just return after
> +    * validating the parameters and generating the required errors.
> +    */
> +   return;
> +}
> +
> +static void GLAPIENTRY
> +_mesa_InvalidateBufferData(GLuint buffer)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_buffer_object *bufObj;
> +
> +   bufObj = _mesa_lookup_bufferobj(ctx, buffer);
> +   if (!bufObj) {
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glInvalidateBufferData(name = 0x%x) invalid object",
> +                  buffer);
> +      return;
> +   }
> +
> +   /* The GL_ARB_invalidate_subdata spec says:
> +    *
> +    *     "An INVALID_OPERATION error is generated if the buffer is currently
> +    *     mapped by MapBuffer, or if the invalidate range intersects the 
> range
> +    *     currently mapped by MapBufferRange."
> +    */
> +   if (bufObj->Pointer) {

Same thing here.


> +      _mesa_error(ctx, GL_INVALID_OPERATION,
> +                  "glInvalidateBufferData(intersection with mapped "
> +                  "range)");
> +      return;
> +   }
> +
> +   /* We don't actually do anything for this yet.  Just return after
> +    * validating the parameters and generating the required errors.
> +    */
> +   return;
> +}
> +
>  void
>  _mesa_init_bufferobj_dispatch(struct gl_context *ctx, struct _glapi_table 
> *disp)
>  {
> @@ -2220,4 +2308,9 @@ _mesa_init_bufferobj_dispatch(struct gl_context *ctx, 
> struct _glapi_table *disp)
>        SET_BindBufferRangeEXT(disp, _mesa_BindBufferRange);
>        SET_BindBufferBaseEXT(disp, _mesa_BindBufferBase);
>     }
> +
> +   if (ctx->API == API_OPENGL || ctx->API == API_OPENGL_CORE) {
> +      SET_InvalidateBufferData(disp, _mesa_InvalidateBufferData);
> +      SET_InvalidateBufferSubData(disp, _mesa_InvalidateBufferSubData);
> +   }
>  }
> --
> 1.7.6.5
>
> _______________________________________________
> mesa-dev mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to