mesa: add & use a new driver flag for UBO updates instead of _NEW_BUFFER_OBJECT

v2: move the flagging from intel_bufferobj_data to intel_bufferobj_alloc_buffer

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Marek Olšák
2013-04-26 14:21:09 +02:00
parent 081c789c3e
commit 77d8fbcfd4
13 changed files with 41 additions and 14 deletions

View File

@@ -152,6 +152,7 @@ brwCreateContext(int api,
ctx->DriverFlags.NewTransformFeedback = BRW_NEW_TRANSFORM_FEEDBACK; ctx->DriverFlags.NewTransformFeedback = BRW_NEW_TRANSFORM_FEEDBACK;
ctx->DriverFlags.NewRasterizerDiscard = BRW_NEW_RASTERIZER_DISCARD; ctx->DriverFlags.NewRasterizerDiscard = BRW_NEW_RASTERIZER_DISCARD;
ctx->DriverFlags.NewUniformBuffer = BRW_NEW_UNIFORM_BUFFER;
ctx->Const.MaxDualSourceDrawBuffers = 1; ctx->Const.MaxDualSourceDrawBuffers = 1;
ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS; ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS;

View File

@@ -153,6 +153,7 @@ enum brw_state_id {
BRW_STATE_TRANSFORM_FEEDBACK, BRW_STATE_TRANSFORM_FEEDBACK,
BRW_STATE_RASTERIZER_DISCARD, BRW_STATE_RASTERIZER_DISCARD,
BRW_STATE_STATS_WM, BRW_STATE_STATS_WM,
BRW_STATE_UNIFORM_BUFFER
}; };
#define BRW_NEW_URB_FENCE (1 << BRW_STATE_URB_FENCE) #define BRW_NEW_URB_FENCE (1 << BRW_STATE_URB_FENCE)
@@ -184,6 +185,7 @@ enum brw_state_id {
#define BRW_NEW_TRANSFORM_FEEDBACK (1 << BRW_STATE_TRANSFORM_FEEDBACK) #define BRW_NEW_TRANSFORM_FEEDBACK (1 << BRW_STATE_TRANSFORM_FEEDBACK)
#define BRW_NEW_RASTERIZER_DISCARD (1 << BRW_STATE_RASTERIZER_DISCARD) #define BRW_NEW_RASTERIZER_DISCARD (1 << BRW_STATE_RASTERIZER_DISCARD)
#define BRW_NEW_STATS_WM (1 << BRW_STATE_STATS_WM) #define BRW_NEW_STATS_WM (1 << BRW_STATE_STATS_WM)
#define BRW_NEW_UNIFORM_BUFFER (1 << BRW_STATE_UNIFORM_BUFFER)
struct brw_state_flags { struct brw_state_flags {
/** State update flags signalled by mesa internals */ /** State update flags signalled by mesa internals */

View File

@@ -372,6 +372,7 @@ static struct dirty_bit_map brw_bits[] = {
DEFINE_BIT(BRW_NEW_VUE_MAP_GEOM_OUT), DEFINE_BIT(BRW_NEW_VUE_MAP_GEOM_OUT),
DEFINE_BIT(BRW_NEW_TRANSFORM_FEEDBACK), DEFINE_BIT(BRW_NEW_TRANSFORM_FEEDBACK),
DEFINE_BIT(BRW_NEW_RASTERIZER_DISCARD), DEFINE_BIT(BRW_NEW_RASTERIZER_DISCARD),
DEFINE_BIT(BRW_NEW_UNIFORM_BUFFER),
{0, 0, 0} {0, 0, 0}
}; };

View File

@@ -122,9 +122,8 @@ brw_upload_vs_ubo_surfaces(struct brw_context *brw)
const struct brw_tracked_state brw_vs_ubo_surfaces = { const struct brw_tracked_state brw_vs_ubo_surfaces = {
.dirty = { .dirty = {
.mesa = (_NEW_PROGRAM | .mesa = _NEW_PROGRAM,
_NEW_BUFFER_OBJECT), .brw = BRW_NEW_BATCH | BRW_NEW_UNIFORM_BUFFER,
.brw = BRW_NEW_BATCH,
.cache = 0, .cache = 0,
}, },
.emit = brw_upload_vs_ubo_surfaces, .emit = brw_upload_vs_ubo_surfaces,

View File

@@ -1564,9 +1564,8 @@ brw_upload_wm_ubo_surfaces(struct brw_context *brw)
const struct brw_tracked_state brw_wm_ubo_surfaces = { const struct brw_tracked_state brw_wm_ubo_surfaces = {
.dirty = { .dirty = {
.mesa = (_NEW_PROGRAM | .mesa = _NEW_PROGRAM,
_NEW_BUFFER_OBJECT), .brw = BRW_NEW_BATCH | BRW_NEW_UNIFORM_BUFFER,
.brw = BRW_NEW_BATCH,
.cache = 0, .cache = 0,
}, },
.emit = brw_upload_wm_ubo_surfaces, .emit = brw_upload_wm_ubo_surfaces,

View File

@@ -39,6 +39,10 @@
#include "intel_mipmap_tree.h" #include "intel_mipmap_tree.h"
#include "intel_regions.h" #include "intel_regions.h"
#ifndef I915
#include "brw_context.h"
#endif
static GLboolean static GLboolean
intel_bufferobj_unmap(struct gl_context * ctx, struct gl_buffer_object *obj); intel_bufferobj_unmap(struct gl_context * ctx, struct gl_buffer_object *obj);
@@ -49,6 +53,15 @@ intel_bufferobj_alloc_buffer(struct intel_context *intel,
{ {
intel_obj->buffer = drm_intel_bo_alloc(intel->bufmgr, "bufferobj", intel_obj->buffer = drm_intel_bo_alloc(intel->bufmgr, "bufferobj",
intel_obj->Base.Size, 64); intel_obj->Base.Size, 64);
#ifndef I915
/* the buffer might be bound as a uniform buffer, need to update it
*/
{
struct brw_context *brw = brw_context(&intel->ctx);
brw->state.dirty.brw |= BRW_NEW_UNIFORM_BUFFER;
}
#endif
} }
static void static void

View File

@@ -2060,7 +2060,8 @@ set_ubo_binding(struct gl_context *ctx,
return; return;
} }
FLUSH_VERTICES(ctx, _NEW_BUFFER_OBJECT); FLUSH_VERTICES(ctx, 0);
ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer;
_mesa_reference_buffer_object(ctx, &binding->BufferObject, bufObj); _mesa_reference_buffer_object(ctx, &binding->BufferObject, bufObj);
binding->Offset = offset; binding->Offset = offset;

View File

@@ -3333,6 +3333,12 @@ struct gl_driver_flags
/** gl_context::RasterDiscard */ /** gl_context::RasterDiscard */
GLbitfield NewRasterizerDiscard; GLbitfield NewRasterizerDiscard;
/**
* gl_context::UniformBufferBindings
* gl_shader_program::UniformBlocks
*/
GLbitfield NewUniformBuffer;
}; };
struct gl_uniform_buffer_binding struct gl_uniform_buffer_binding

View File

@@ -631,7 +631,9 @@ _mesa_UniformBlockBinding(GLuint program,
uniformBlockBinding) { uniformBlockBinding) {
int i; int i;
FLUSH_VERTICES(ctx, _NEW_BUFFER_OBJECT); FLUSH_VERTICES(ctx, 0);
ctx->NewDriverState |= ctx->DriverFlags.NewUniformBuffer;
shProg->UniformBlocks[uniformBlockIndex].Binding = uniformBlockBinding; shProg->UniformBlocks[uniformBlockIndex].Binding = uniformBlockBinding;
for (i = 0; i < MESA_SHADER_TYPES; i++) { for (i = 0; i < MESA_SHADER_TYPES; i++) {

View File

@@ -217,8 +217,8 @@ static void bind_vs_ubos(struct st_context *st)
const struct st_tracked_state st_bind_vs_ubos = { const struct st_tracked_state st_bind_vs_ubos = {
"st_bind_vs_ubos", "st_bind_vs_ubos",
{ {
(_NEW_PROGRAM | _NEW_BUFFER_OBJECT), _NEW_PROGRAM,
ST_NEW_VERTEX_PROGRAM, ST_NEW_VERTEX_PROGRAM | ST_NEW_UNIFORM_BUFFER,
}, },
bind_vs_ubos bind_vs_ubos
}; };
@@ -231,14 +231,13 @@ static void bind_fs_ubos(struct st_context *st)
return; return;
st_bind_ubos(st, prog->_LinkedShaders[MESA_SHADER_FRAGMENT], PIPE_SHADER_FRAGMENT); st_bind_ubos(st, prog->_LinkedShaders[MESA_SHADER_FRAGMENT], PIPE_SHADER_FRAGMENT);
} }
const struct st_tracked_state st_bind_fs_ubos = { const struct st_tracked_state st_bind_fs_ubos = {
"st_bind_fs_ubos", "st_bind_fs_ubos",
{ {
(_NEW_PROGRAM | _NEW_BUFFER_OBJECT), _NEW_PROGRAM,
ST_NEW_FRAGMENT_PROGRAM, ST_NEW_FRAGMENT_PROGRAM | ST_NEW_UNIFORM_BUFFER,
}, },
bind_fs_ubos bind_fs_ubos
}; };

View File

@@ -247,9 +247,11 @@ st_bufferobj_data(struct gl_context *ctx,
if (data) if (data)
pipe_buffer_write(pipe, st_obj->buffer, 0, size, data); pipe_buffer_write(pipe, st_obj->buffer, 0, size, data);
return GL_TRUE;
} }
/* BufferData may change a uniform buffer, need to update it */
st->dirty.st |= ST_NEW_UNIFORM_BUFFER;
return GL_TRUE; return GL_TRUE;
} }

View File

@@ -209,6 +209,7 @@ static void st_init_driver_flags(struct gl_driver_flags *f)
{ {
f->NewArray = ST_NEW_VERTEX_ARRAYS; f->NewArray = ST_NEW_VERTEX_ARRAYS;
f->NewRasterizerDiscard = ST_NEW_RASTERIZER; f->NewRasterizerDiscard = ST_NEW_RASTERIZER;
f->NewUniformBuffer = ST_NEW_UNIFORM_BUFFER;
} }
struct st_context *st_create_context(gl_api api, struct pipe_context *pipe, struct st_context *st_create_context(gl_api api, struct pipe_context *pipe,

View File

@@ -51,6 +51,7 @@ struct u_upload_mgr;
#define ST_NEW_GEOMETRY_PROGRAM (1 << 5) #define ST_NEW_GEOMETRY_PROGRAM (1 << 5)
#define ST_NEW_VERTEX_ARRAYS (1 << 6) #define ST_NEW_VERTEX_ARRAYS (1 << 6)
#define ST_NEW_RASTERIZER (1 << 7) #define ST_NEW_RASTERIZER (1 << 7)
#define ST_NEW_UNIFORM_BUFFER (1 << 8)
struct st_state_flags { struct st_state_flags {