From a9b800aa81cffdcaef2490ff49986099feae2663 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sun, 11 Aug 2013 22:44:44 +0800 Subject: [PATCH] ilo: initialize constant buffer SURFACE_STATE early Fix ilo_gpe_init_view_surface_for_buffer to allow buffer to be NULL, and add ilo_gpe_set_view_surface_bo to set it later. This allows us to set up SURFACE_STATE early for constant buffers backed by user buffers. --- src/gallium/drivers/ilo/ilo_gpe.h | 15 +++++++++++ src/gallium/drivers/ilo/ilo_gpe_gen6.c | 4 +-- src/gallium/drivers/ilo/ilo_gpe_gen6.h | 3 --- src/gallium/drivers/ilo/ilo_state.c | 37 +++++++++++--------------- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/gallium/drivers/ilo/ilo_gpe.h b/src/gallium/drivers/ilo/ilo_gpe.h index f0768b9de5c..17b131b0bc1 100644 --- a/src/gallium/drivers/ilo/ilo_gpe.h +++ b/src/gallium/drivers/ilo/ilo_gpe.h @@ -53,6 +53,9 @@ #define ILO_WM_CONST_SURFACE(i) (ILO_MAX_DRAW_BUFFERS + i) #define ILO_WM_TEXTURE_SURFACE(i) (ILO_MAX_DRAW_BUFFERS + ILO_MAX_CONST_BUFFERS + i) +#define ILO_GPE_VALID_GEN(dev, min_gen, max_gen) \ + assert((dev)->gen >= ILO_GEN(min_gen) && (dev)->gen <= ILO_GEN(max_gen)) + struct ilo_buffer; struct ilo_texture; struct ilo_shader_state; @@ -467,6 +470,18 @@ ilo_gpe_init_view_surface_for_texture(const struct ilo_dev_info *dev, } } +static inline void +ilo_gpe_set_view_surface_bo(const struct ilo_dev_info *dev, + struct intel_bo *bo, unsigned offset, + struct ilo_view_surface *surf) +{ + ILO_GPE_VALID_GEN(dev, 6, 7); + + /* do not increment reference count */ + surf->bo = bo; + surf->payload[1] = offset; +} + void ilo_gpe_init_zs_surface(const struct ilo_dev_info *dev, const struct ilo_texture *tex, diff --git a/src/gallium/drivers/ilo/ilo_gpe_gen6.c b/src/gallium/drivers/ilo/ilo_gpe_gen6.c index cd122734868..da63f0c2a66 100644 --- a/src/gallium/drivers/ilo/ilo_gpe_gen6.c +++ b/src/gallium/drivers/ilo/ilo_gpe_gen6.c @@ -1873,7 +1873,7 @@ ilo_gpe_init_view_surface_for_buffer_gen6(const struct ilo_dev_info *dev, if (render_cache_rw) dw[0] |= BRW_SURFACE_RC_READ_WRITE; - dw[1] = offset; + dw[1] = (buf) ? offset : 0; dw[2] = height << BRW_SURFACE_HEIGHT_SHIFT | width << BRW_SURFACE_WIDTH_SHIFT; @@ -1885,7 +1885,7 @@ ilo_gpe_init_view_surface_for_buffer_gen6(const struct ilo_dev_info *dev, dw[5] = 0; /* do not increment reference count */ - surf->bo = buf->bo; + surf->bo = (buf) ? buf->bo : NULL; } void diff --git a/src/gallium/drivers/ilo/ilo_gpe_gen6.h b/src/gallium/drivers/ilo/ilo_gpe_gen6.h index a3dea39349c..26aa7216c33 100644 --- a/src/gallium/drivers/ilo/ilo_gpe_gen6.h +++ b/src/gallium/drivers/ilo/ilo_gpe_gen6.h @@ -39,9 +39,6 @@ #include "ilo_shader.h" #include "ilo_gpe.h" -#define ILO_GPE_VALID_GEN(dev, min_gen, max_gen) \ - assert((dev)->gen >= ILO_GEN(min_gen) && (dev)->gen <= ILO_GEN(max_gen)) - #define ILO_GPE_CMD(pipeline, op, subop) \ (0x3 << 29 | (pipeline) << 27 | (op) << 24 | (subop) << 16) diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c index ce6930c4aec..b4af306e54a 100644 --- a/src/gallium/drivers/ilo/ilo_state.c +++ b/src/gallium/drivers/ilo/ilo_state.c @@ -105,18 +105,13 @@ finalize_constant_buffers(struct ilo_context *ilo) /* upload user buffer */ if (cbuf->user_buffer) { - const enum pipe_format elem_format = - PIPE_FORMAT_R32G32B32A32_FLOAT; unsigned offset; u_upload_data(ilo->uploader, 0, cbuf->user_buffer_size, cbuf->user_buffer, &offset, &cbuf->resource); - ilo_gpe_init_view_surface_for_buffer(ilo->dev, - ilo_buffer(cbuf->resource), - offset, cbuf->user_buffer_size, - util_format_get_blocksize(elem_format), elem_format, - false, false, &cbuf->surface); + ilo_gpe_set_view_surface_bo(ilo->dev, + ilo_buffer(cbuf->resource)->bo, offset, &cbuf->surface); cbuf->user_buffer = NULL; cbuf->user_buffer_size = 0; @@ -633,26 +628,18 @@ ilo_set_constant_buffer(struct pipe_context *pipe, if (buf) { for (i = 0; i < count; i++) { + const enum pipe_format elem_format = PIPE_FORMAT_R32G32B32A32_FLOAT; struct ilo_cbuf_cso *cso = &cbuf->cso[index + i]; pipe_resource_reference(&cso->resource, buf[i].buffer); - if (buf[i].buffer) { - const enum pipe_format elem_format = - PIPE_FORMAT_R32G32B32A32_FLOAT; + ilo_gpe_init_view_surface_for_buffer(ilo->dev, + ilo_buffer(buf[i].buffer), + buf[i].buffer_offset, buf[i].buffer_size, + util_format_get_blocksize(elem_format), elem_format, + false, false, &cso->surface); - ilo_gpe_init_view_surface_for_buffer(ilo->dev, - ilo_buffer(buf[i].buffer), - buf[i].buffer_offset, buf[i].buffer_size, - util_format_get_blocksize(elem_format), elem_format, - false, false, &cso->surface); - - cso->user_buffer = NULL; - cso->user_buffer_size = 0; - - cbuf->enabled_mask |= 1 << (index + i); - } - else if (buf[i].user_buffer) { + if (buf[i].user_buffer) { cso->surface.bo = NULL; /* buffer_offset does not apply for user buffer */ @@ -661,6 +648,12 @@ ilo_set_constant_buffer(struct pipe_context *pipe, cbuf->enabled_mask |= 1 << (index + i); } + else if (buf[i].buffer) { + cso->user_buffer = NULL; + cso->user_buffer_size = 0; + + cbuf->enabled_mask |= 1 << (index + i); + } else { cso->surface.bo = NULL; cso->user_buffer = NULL; -- 2.30.2