i965/wm: use proper API buffer size for the surfaces.
authorSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Tue, 15 Dec 2015 11:51:48 +0000 (12:51 +0100)
committerSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Mon, 4 Jan 2016 06:52:24 +0000 (07:52 +0100)
Commit 5bb5eeea fixes a bug indicating that the surfaces should have the
API buffer size. Hovewer it picked the wrong value.

This patch adds a new variable, which takes into account
glBindBufferRange() values. This patch fixes the following CTS
regressions:

ES31-CTS.shader_storage_buffer_object.advanced-unsizedArrayLength-cs-std430-vec-bindrangeOffset
ES31-CTS.shader_storage_buffer_object.advanced-unsizedArrayLength-cs-std430-vec-bindrangeSize

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Marta Lofstedt <marta.lofstedt@intel.com>
src/mesa/drivers/dri/i965/brw_wm_surface_state.c
src/mesa/drivers/dri/i965/intel_buffer_objects.c
src/mesa/main/bufferobj.c
src/mesa/main/mtypes.h

index 76dc577512163c664c626a7e3754b11df84e954a..7da4a4046682c35f03b1807610acd6d735fc0269 100644 (file)
@@ -946,12 +946,14 @@ brw_upload_ubo_surfaces(struct brw_context *brw,
       } else {
          struct intel_buffer_object *intel_bo =
             intel_buffer_object(binding->BufferObject);
+         GLsizeiptrARB size = MIN2(binding->BufferObject->BufferRangeSize,
+                                   binding->BufferObject->Size - binding->Offset);
          drm_intel_bo *bo =
             intel_bufferobj_buffer(brw, intel_bo,
                                    binding->Offset,
-                                   binding->BufferObject->Size - binding->Offset);
+                                   size);
          brw_create_constant_surface(brw, bo, binding->Offset,
-                                     binding->BufferObject->Size - binding->Offset,
+                                     size,
                                      &ubo_surf_offsets[i]);
       }
    }
@@ -968,12 +970,14 @@ brw_upload_ubo_surfaces(struct brw_context *brw,
       } else {
          struct intel_buffer_object *intel_bo =
             intel_buffer_object(binding->BufferObject);
+         GLsizeiptrARB size = MIN2(binding->BufferObject->BufferRangeSize,
+                                   binding->BufferObject->Size - binding->Offset);
          drm_intel_bo *bo =
             intel_bufferobj_buffer(brw, intel_bo,
                                    binding->Offset,
-                                   binding->BufferObject->Size - binding->Offset);
+                                   size);
          brw_create_buffer_surface(brw, bo, binding->Offset,
-                                   binding->BufferObject->Size - binding->Offset,
+                                   size,
                                    &ssbo_surf_offsets[i]);
       }
    }
index 7a5b3fca595e3f3db46eb97553d75d37fc015d5f..b26c939c2146525d105ff96ecd1fcaec3634aaa7 100644 (file)
@@ -198,6 +198,7 @@ brw_buffer_data(struct gl_context *ctx,
    (void) target;
 
    intel_obj->Base.Size = size;
+   intel_obj->Base.BufferRangeSize = size;
    intel_obj->Base.Usage = usage;
    intel_obj->Base.StorageFlags = storageFlags;
 
index 3a05cd55042ba5d8fea30350fce50ed599ec1829..8a9f9b6a48d222b105ef6f768dae8a57ae85c434 100644 (file)
@@ -43,7 +43,7 @@
 #include "glformats.h"
 #include "texstore.h"
 #include "transformfeedback.h"
-
+#include "macros.h"
 
 /* Debug flags */
 /*#define VBO_DEBUG*/
@@ -2840,6 +2840,7 @@ bind_buffer_range_uniform_buffer(struct gl_context *ctx,
 
    _mesa_reference_buffer_object(ctx, &ctx->UniformBuffer, bufObj);
    bind_uniform_buffer(ctx, index, bufObj, offset, size, GL_FALSE);
+   bufObj->BufferRangeSize = MIN2(size, bufObj->Size);
 }
 
 /**
@@ -2875,6 +2876,7 @@ bind_buffer_range_shader_storage_buffer(struct gl_context *ctx,
 
    _mesa_reference_buffer_object(ctx, &ctx->ShaderStorageBuffer, bufObj);
    bind_shader_storage_buffer(ctx, index, bufObj, offset, size, GL_FALSE);
+   bufObj->BufferRangeSize = MIN2(size, bufObj->Size);
 }
 
 /**
index 5b9fce8b7ccc173ba8da824fe8c0ce5b92aa72a8..97116e400cef33e3f74f634c70c70cf88038ca84 100644 (file)
@@ -1268,6 +1268,7 @@ struct gl_buffer_object
    GLenum Usage;        /**< GL_STREAM_DRAW_ARB, GL_STREAM_READ_ARB, etc. */
    GLbitfield StorageFlags; /**< GL_MAP_PERSISTENT_BIT, etc. */
    GLsizeiptrARB Size;  /**< Size of buffer storage in bytes */
+   GLsizeiptrARB BufferRangeSize;  /**< Amount of data that can be read from or written to, in bytes */
    GLubyte *Data;       /**< Location of storage either in RAM or VRAM. */
    GLboolean DeletePending;   /**< true if buffer object is removed from the hash */
    GLboolean Written;   /**< Ever written to? (for debugging) */