diff options
author | Jason Ekstrand <[email protected]> | 2019-05-28 17:52:58 -0500 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2019-05-29 21:09:16 +0000 |
commit | 744f93f5c1e0d1e000e44f61e721c2d5fb545025 (patch) | |
tree | f38d28dab233968db3c9545650c4b1cb137df00b | |
parent | e584fd894ed1b4497d668f7145c8514914d6ad8f (diff) |
iris: Move upload_ubo_ssbo_surf_state to iris_program.c
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/gallium/drivers/iris/iris_context.h | 4 | ||||
-rw-r--r-- | src/gallium/drivers/iris/iris_program.c | 45 | ||||
-rw-r--r-- | src/gallium/drivers/iris/iris_state.c | 46 |
3 files changed, 56 insertions, 39 deletions
diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h index 42cad5e8551..3009c8d5627 100644 --- a/src/gallium/drivers/iris/iris_context.h +++ b/src/gallium/drivers/iris/iris_context.h @@ -780,6 +780,10 @@ void gen11_emit_urb_setup(struct iris_context *ice, bool tess_present, bool gs_present); /* iris_program.c */ +void iris_upload_ubo_ssbo_surf_state(struct iris_context *ice, + struct pipe_shader_buffer *buf, + struct iris_state_ref *surf_state, + bool ssbo); const struct shader_info *iris_get_shader_info(const struct iris_context *ice, gl_shader_stage stage); struct iris_bo *iris_get_scratch_space(struct iris_context *ice, diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c index 0e294d1b8e0..37cf123ae6b 100644 --- a/src/gallium/drivers/iris/iris_program.c +++ b/src/gallium/drivers/iris/iris_program.c @@ -36,6 +36,7 @@ #include "pipe/p_context.h" #include "pipe/p_screen.h" #include "util/u_atomic.h" +#include "util/u_upload_mgr.h" #include "compiler/nir/nir.h" #include "compiler/nir/nir_builder.h" #include "compiler/nir/nir_serialize.h" @@ -56,6 +57,50 @@ get_new_program_id(struct iris_screen *screen) return p_atomic_inc_return(&screen->program_id); } +static void * +upload_state(struct u_upload_mgr *uploader, + struct iris_state_ref *ref, + unsigned size, + unsigned alignment) +{ + void *p = NULL; + u_upload_alloc(uploader, 0, size, alignment, &ref->offset, &ref->res, &p); + return p; +} + +void +iris_upload_ubo_ssbo_surf_state(struct iris_context *ice, + struct pipe_shader_buffer *buf, + struct iris_state_ref *surf_state, + bool ssbo) +{ + struct pipe_context *ctx = &ice->ctx; + struct iris_screen *screen = (struct iris_screen *) ctx->screen; + + // XXX: these are not retained forever, use a separate uploader? + void *map = + upload_state(ice->state.surface_uploader, surf_state, + screen->isl_dev.ss.size, 64); + if (!unlikely(map)) { + surf_state->res = NULL; + return; + } + + struct iris_resource *res = (void *) buf->buffer; + struct iris_bo *surf_bo = iris_resource_bo(surf_state->res); + surf_state->offset += iris_bo_offset_from_base_address(surf_bo); + + isl_buffer_fill_state(&screen->isl_dev, map, + .address = res->bo->gtt_offset + res->offset + + buf->buffer_offset, + .size_B = buf->buffer_size - res->offset, + .format = ssbo ? ISL_FORMAT_RAW + : ISL_FORMAT_R32G32B32A32_FLOAT, + .swizzle = ISL_SWIZZLE_IDENTITY, + .stride_B = 1, + .mocs = ice->vtbl.mocs(res->bo)); +} + static nir_ssa_def * get_aoa_deref_offset(nir_builder *b, nir_deref_instr *deref, diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index da6e4a31c85..0f6290ae8dc 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -2575,40 +2575,6 @@ iris_set_framebuffer_state(struct pipe_context *ctx, #endif } -static void -upload_ubo_ssbo_surf_state(struct iris_context *ice, - struct pipe_shader_buffer *buf, - struct iris_state_ref *surf_state, - bool ssbo) -{ - struct pipe_context *ctx = &ice->ctx; - struct iris_screen *screen = (struct iris_screen *) ctx->screen; - - // XXX: these are not retained forever, use a separate uploader? - void *map = - upload_state(ice->state.surface_uploader, surf_state, - 4 * GENX(RENDER_SURFACE_STATE_length), 64); - if (!unlikely(map)) { - surf_state->res = NULL; - return; - } - - struct iris_resource *res = (void *) buf->buffer; - struct iris_bo *surf_bo = iris_resource_bo(surf_state->res); - surf_state->offset += iris_bo_offset_from_base_address(surf_bo); - - isl_buffer_fill_state(&screen->isl_dev, map, - .address = res->bo->gtt_offset + res->offset + - buf->buffer_offset, - .size_B = buf->buffer_size - res->offset, - .format = ssbo ? ISL_FORMAT_RAW - : ISL_FORMAT_R32G32B32A32_FLOAT, - .swizzle = ISL_SWIZZLE_IDENTITY, - .stride_B = 1, - .mocs = mocs(res->bo)) - -} - /** * The pipe->set_constant_buffer() driver hook. * @@ -2639,8 +2605,9 @@ iris_set_constant_buffer(struct pipe_context *ctx, struct iris_resource *res = (void *) cbuf->buffer; res->bind_history |= PIPE_BIND_CONSTANT_BUFFER; - upload_ubo_ssbo_surf_state(ice, cbuf, &shs->constbuf_surf_state[index], - false); + iris_upload_ubo_ssbo_surf_state(ice, cbuf, + &shs->constbuf_surf_state[index], + false); } else { shs->bound_cbufs &= ~(1u << index); pipe_resource_reference(&cbuf->buffer, NULL); @@ -2734,7 +2701,8 @@ upload_uniforms(struct iris_context *ice, } cbuf->buffer_size = upload_size; - upload_ubo_ssbo_surf_state(ice, cbuf, &shs->constbuf_surf_state[0], false); + iris_upload_ubo_ssbo_surf_state(ice, cbuf, + &shs->constbuf_surf_state[0], false); } /** @@ -2773,7 +2741,7 @@ iris_set_shader_buffers(struct pipe_context *ctx, shs->bound_ssbos |= 1 << (start_slot + i); - upload_ubo_ssbo_surf_state(ice, ssbo, surf_state, true); + iris_upload_ubo_ssbo_surf_state(ice, ssbo, surf_state, true); res->bind_history |= PIPE_BIND_SHADER_BUFFER; @@ -5807,7 +5775,7 @@ iris_rebind_buffer(struct iris_context *ice, struct iris_state_ref *surf_state = &shs->constbuf_surf_state[i]; if (res->bo == iris_resource_bo(cbuf->buffer)) { - upload_ubo_ssbo_surf_state(ice, cbuf, surf_state, false); + iris_upload_ubo_ssbo_surf_state(ice, cbuf, surf_state, false); ice->state.dirty |= IRIS_DIRTY_CONSTANTS_VS << s; } } |