[Mesa-dev] [PATCH 11/23] main: Refactor ClearBuffer[Sub]Data.
Martin Peres
martin.peres at free.fr
Fri Feb 20 06:18:40 PST 2015
On 12/02/2015 04:05, Laura Ekstrand wrote:
> v2: review by Jason Ekstrand
> - Split refactor of clear buffer sub data from addition of DSA entry
> points.
> ---
> src/mesa/main/bufferobj.c | 125 ++++++++++++---------------
> src/mesa/main/bufferobj.h | 19 ++--
> src/mesa/state_tracker/st_cb_bufferobjects.c | 4 +-
> 3 files changed, 69 insertions(+), 79 deletions(-)
>
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index 7225b64..b8fa917 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -660,11 +660,11 @@ _mesa_buffer_get_subdata( struct gl_context *ctx, GLintptrARB offset,
> * dd_function_table::ClearBufferSubData.
> */
> void
> -_mesa_buffer_clear_subdata(struct gl_context *ctx,
> - GLintptr offset, GLsizeiptr size,
> - const GLvoid *clearValue,
> - GLsizeiptr clearValueSize,
> - struct gl_buffer_object *bufObj)
> +_mesa_ClearBufferSubData_sw(struct gl_context *ctx,
Interesting choice of naming the function as a mix of camel case and
underscores.
Since it is an internal function, shouldn't it only have underscores?
Other than that:
Reviewed-by: Martin Peres <martin.peres at linux.intel.com>
> + GLintptr offset, GLsizeiptr size,
> + const GLvoid *clearValue,
> + GLsizeiptr clearValueSize,
> + struct gl_buffer_object *bufObj)
> {
> GLsizeiptr i;
> GLubyte *dest;
> @@ -1113,7 +1113,7 @@ _mesa_init_buffer_object_functions(struct dd_function_table *driver)
> driver->UnmapBuffer = _mesa_buffer_unmap;
>
> /* GL_ARB_clear_buffer_object */
> - driver->ClearBufferSubData = _mesa_buffer_clear_subdata;
> + driver->ClearBufferSubData = _mesa_ClearBufferSubData_sw;
>
> /* GL_ARB_map_buffer_range */
> driver->MapBufferRange = _mesa_buffer_map_range;
> @@ -1671,57 +1671,77 @@ _mesa_GetBufferSubData(GLenum target, GLintptr offset,
> ctx->Driver.GetBufferSubData( ctx, offset, size, data, bufObj );
> }
>
> -
> -void GLAPIENTRY
> -_mesa_ClearBufferData(GLenum target, GLenum internalformat, GLenum format,
> - GLenum type, const GLvoid* data)
> +/**
> + * \param subdata true if caller is *SubData, false if *Data
> + */
> +void
> +_mesa_clear_buffer_sub_data(struct gl_context *ctx,
> + struct gl_buffer_object *bufObj,
> + GLenum internalformat,
> + GLintptr offset, GLsizeiptr size,
> + GLenum format, GLenum type,
> + const GLvoid *data,
> + const char *func, bool subdata)
> {
> - GET_CURRENT_CONTEXT(ctx);
> - struct gl_buffer_object* bufObj;
> mesa_format mesaFormat;
> GLubyte clearValue[MAX_PIXEL_BYTES];
> GLsizeiptr clearValueSize;
>
> - bufObj = get_buffer(ctx, "glClearBufferData", target, GL_INVALID_VALUE);
> - if (!bufObj) {
> - return;
> - }
> -
> - if (_mesa_check_disallowed_mapping(bufObj)) {
> - _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glClearBufferData(buffer currently mapped)");
> + /* This checks for disallowed mappings. */
> + if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size,
> + subdata, func)) {
> return;
> }
>
> mesaFormat = validate_clear_buffer_format(ctx, internalformat,
> - format, type,
> - "glClearBufferData");
> + format, type, func);
> +
> if (mesaFormat == MESA_FORMAT_NONE) {
> return;
> }
>
> clearValueSize = _mesa_get_format_bytes(mesaFormat);
> - if (bufObj->Size % clearValueSize != 0) {
> + if (offset % clearValueSize != 0 || size % clearValueSize != 0) {
> _mesa_error(ctx, GL_INVALID_VALUE,
> - "glClearBufferData(size is not a multiple of "
> - "internalformat size)");
> + "%s(offset or size is not a multiple of "
> + "internalformat size)", func);
> return;
> }
>
> if (data == NULL) {
> /* clear to zeros, per the spec */
> - ctx->Driver.ClearBufferSubData(ctx, 0, bufObj->Size,
> - NULL, clearValueSize, bufObj);
> + if (size > 0) {
> + ctx->Driver.ClearBufferSubData(ctx, offset, size,
> + NULL, clearValueSize, bufObj);
> + }
> return;
> }
>
> if (!convert_clear_buffer_data(ctx, mesaFormat, clearValue,
> - format, type, data, "glClearBufferData")) {
> + format, type, data, func)) {
> return;
> }
>
> - ctx->Driver.ClearBufferSubData(ctx, 0, bufObj->Size,
> - clearValue, clearValueSize, bufObj);
> + if (size > 0) {
> + ctx->Driver.ClearBufferSubData(ctx, offset, size,
> + clearValue, clearValueSize, bufObj);
> + }
> +}
> +
> +void GLAPIENTRY
> +_mesa_ClearBufferData(GLenum target, GLenum internalformat, GLenum format,
> + GLenum type, const GLvoid *data)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_buffer_object *bufObj;
> +
> + bufObj = get_buffer(ctx, "glClearBufferData", target, GL_INVALID_VALUE);
> + if (!bufObj)
> + return;
> +
> + _mesa_clear_buffer_sub_data(ctx, bufObj, internalformat, 0, bufObj->Size,
> + format, type, data,
> + "glClearBufferData", false);
> }
>
>
> @@ -1733,53 +1753,14 @@ _mesa_ClearBufferSubData(GLenum target, GLenum internalformat,
> {
> GET_CURRENT_CONTEXT(ctx);
> struct gl_buffer_object* bufObj;
> - mesa_format mesaFormat;
> - GLubyte clearValue[MAX_PIXEL_BYTES];
> - GLsizeiptr clearValueSize;
>
> bufObj = get_buffer(ctx, "glClearBufferSubData", target, GL_INVALID_VALUE);
> if (!bufObj)
> return;
>
> - if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size,
> - true, "glClearBufferSubData")) {
> - return;
> - }
> -
> - mesaFormat = validate_clear_buffer_format(ctx, internalformat,
> - format, type,
> - "glClearBufferSubData");
> - if (mesaFormat == MESA_FORMAT_NONE) {
> - return;
> - }
> -
> - clearValueSize = _mesa_get_format_bytes(mesaFormat);
> - if (offset % clearValueSize != 0 || size % clearValueSize != 0) {
> - _mesa_error(ctx, GL_INVALID_VALUE,
> - "glClearBufferSubData(offset or size is not a multiple of "
> - "internalformat size)");
> - return;
> - }
> -
> - if (data == NULL) {
> - /* clear to zeros, per the spec */
> - if (size > 0) {
> - ctx->Driver.ClearBufferSubData(ctx, offset, size,
> - NULL, clearValueSize, bufObj);
> - }
> - return;
> - }
> -
> - if (!convert_clear_buffer_data(ctx, mesaFormat, clearValue,
> - format, type, data,
> - "glClearBufferSubData")) {
> - return;
> - }
> -
> - if (size > 0) {
> - ctx->Driver.ClearBufferSubData(ctx, offset, size,
> - clearValue, clearValueSize, bufObj);
> - }
> + _mesa_clear_buffer_sub_data(ctx, bufObj, internalformat, offset, size,
> + format, type, data,
> + "glClearBufferSubData", true);
> }
>
>
> diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h
> index 7db5c98..5911270 100644
> --- a/src/mesa/main/bufferobj.h
> +++ b/src/mesa/main/bufferobj.h
> @@ -156,11 +156,20 @@ _mesa_copy_buffer_sub_data(struct gl_context *ctx,
> GLsizeiptr size, const char *func);
>
> extern void
> -_mesa_buffer_clear_subdata(struct gl_context *ctx,
> - GLintptr offset, GLsizeiptr size,
> - const GLvoid *clearValue,
> - GLsizeiptr clearValueSize,
> - struct gl_buffer_object *bufObj);
> +_mesa_ClearBufferSubData_sw(struct gl_context *ctx,
> + GLintptr offset, GLsizeiptr size,
> + const GLvoid *clearValue,
> + GLsizeiptr clearValueSize,
> + struct gl_buffer_object *bufObj);
> +
> +extern void
> +_mesa_clear_buffer_sub_data(struct gl_context *ctx,
> + struct gl_buffer_object *bufObj,
> + GLenum internalformat,
> + GLintptr offset, GLsizeiptr size,
> + GLenum format, GLenum type,
> + const GLvoid *data,
> + const char *func, bool subdata);
>
> /*
> * API functions
> diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
> index 90f786c..b7096f7 100644
> --- a/src/mesa/state_tracker/st_cb_bufferobjects.c
> +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
> @@ -477,8 +477,8 @@ st_clear_buffer_subdata(struct gl_context *ctx,
> static const char zeros[16] = {0};
>
> if (!pipe->clear_buffer) {
> - _mesa_buffer_clear_subdata(ctx, offset, size,
> - clearValue, clearValueSize, bufObj);
> + _mesa_ClearBufferSubData_sw(ctx, offset, size,
> + clearValue, clearValueSize, bufObj);
> return;
> }
>
More information about the mesa-dev
mailing list