radeonsi: inline struct si_sampler_views

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Marek Olšák
2017-10-02 17:07:52 +02:00
parent 23cdde5138
commit 15d918e46f
5 changed files with 37 additions and 42 deletions

View File

@@ -80,10 +80,10 @@ static void si_blitter_begin(struct pipe_context *ctx, enum si_blitter_op op)
if (op & SI_SAVE_TEXTURES) { if (op & SI_SAVE_TEXTURES) {
util_blitter_save_fragment_sampler_states( util_blitter_save_fragment_sampler_states(
sctx->blitter, 2, sctx->blitter, 2,
(void**)sctx->samplers[PIPE_SHADER_FRAGMENT].views.sampler_states); (void**)sctx->samplers[PIPE_SHADER_FRAGMENT].sampler_states);
util_blitter_save_fragment_sampler_views(sctx->blitter, 2, util_blitter_save_fragment_sampler_views(sctx->blitter, 2,
sctx->samplers[PIPE_SHADER_FRAGMENT].views.views); sctx->samplers[PIPE_SHADER_FRAGMENT].views);
} }
if (op & SI_DISABLE_RENDER_COND) if (op & SI_DISABLE_RENDER_COND)
@@ -433,7 +433,7 @@ si_decompress_sampler_depth_textures(struct si_context *sctx,
i = u_bit_scan(&mask); i = u_bit_scan(&mask);
view = textures->views.views[i]; view = textures->views[i];
assert(view); assert(view);
sview = (struct si_sampler_view*)view; sview = (struct si_sampler_view*)view;
@@ -559,7 +559,7 @@ si_decompress_sampler_color_textures(struct si_context *sctx,
i = u_bit_scan(&mask); i = u_bit_scan(&mask);
view = textures->views.views[i]; view = textures->views[i];
assert(view); assert(view);
tex = (struct r600_texture *)view->texture; tex = (struct r600_texture *)view->texture;
@@ -629,7 +629,7 @@ static void si_check_render_feedback_texture(struct si_context *sctx,
static void si_check_render_feedback_textures(struct si_context *sctx, static void si_check_render_feedback_textures(struct si_context *sctx,
struct si_samplers *textures) struct si_samplers *textures)
{ {
uint32_t mask = textures->views.enabled_mask; uint32_t mask = textures->enabled_mask;
while (mask) { while (mask) {
const struct pipe_sampler_view *view; const struct pipe_sampler_view *view;
@@ -637,7 +637,7 @@ static void si_check_render_feedback_textures(struct si_context *sctx,
unsigned i = u_bit_scan(&mask); unsigned i = u_bit_scan(&mask);
view = textures->views.views[i]; view = textures->views[i];
if(view->texture->target == PIPE_BUFFER) if(view->texture->target == PIPE_BUFFER)
continue; continue;

View File

@@ -736,7 +736,7 @@ static void si_dump_descriptors(struct si_context *sctx,
u_bit_consecutive(0, SI_NUM_SHADER_BUFFERS); u_bit_consecutive(0, SI_NUM_SHADER_BUFFERS);
enabled_shaderbuf = util_bitreverse(enabled_shaderbuf) >> enabled_shaderbuf = util_bitreverse(enabled_shaderbuf) >>
(32 - SI_NUM_SHADER_BUFFERS); (32 - SI_NUM_SHADER_BUFFERS);
enabled_samplers = sctx->samplers[processor].views.enabled_mask; enabled_samplers = sctx->samplers[processor].enabled_mask;
enabled_images = sctx->images[processor].enabled_mask; enabled_images = sctx->images[processor].enabled_mask;
} }

View File

@@ -194,12 +194,12 @@ si_sampler_and_image_descriptors(struct si_context *sctx, unsigned shader)
return &sctx->descriptors[si_sampler_and_image_descriptors_idx(shader)]; return &sctx->descriptors[si_sampler_and_image_descriptors_idx(shader)];
} }
static void si_release_sampler_views(struct si_sampler_views *views) static void si_release_sampler_views(struct si_samplers *samplers)
{ {
int i; int i;
for (i = 0; i < ARRAY_SIZE(views->views); i++) { for (i = 0; i < ARRAY_SIZE(samplers->views); i++) {
pipe_sampler_view_reference(&views->views[i], NULL); pipe_sampler_view_reference(&samplers->views[i], NULL);
} }
} }
@@ -243,14 +243,14 @@ static void si_sampler_view_add_buffer(struct si_context *sctx,
} }
static void si_sampler_views_begin_new_cs(struct si_context *sctx, static void si_sampler_views_begin_new_cs(struct si_context *sctx,
struct si_sampler_views *views) struct si_samplers *samplers)
{ {
unsigned mask = views->enabled_mask; unsigned mask = samplers->enabled_mask;
/* Add buffers to the CS. */ /* Add buffers to the CS. */
while (mask) { while (mask) {
int i = u_bit_scan(&mask); int i = u_bit_scan(&mask);
struct si_sampler_view *sview = (struct si_sampler_view *)views->views[i]; struct si_sampler_view *sview = (struct si_sampler_view *)samplers->views[i];
si_sampler_view_add_buffer(sctx, sview->base.texture, si_sampler_view_add_buffer(sctx, sview->base.texture,
RADEON_USAGE_READ, RADEON_USAGE_READ,
@@ -466,20 +466,19 @@ static void si_set_sampler_view(struct si_context *sctx,
bool disallow_early_out) bool disallow_early_out)
{ {
struct si_samplers *samplers = &sctx->samplers[shader]; struct si_samplers *samplers = &sctx->samplers[shader];
struct si_sampler_views *views = &samplers->views;
struct si_sampler_view *rview = (struct si_sampler_view*)view; struct si_sampler_view *rview = (struct si_sampler_view*)view;
struct si_descriptors *descs = si_sampler_and_image_descriptors(sctx, shader); struct si_descriptors *descs = si_sampler_and_image_descriptors(sctx, shader);
unsigned desc_slot = si_get_sampler_slot(slot); unsigned desc_slot = si_get_sampler_slot(slot);
uint32_t *desc = descs->list + desc_slot * 16; uint32_t *desc = descs->list + desc_slot * 16;
if (views->views[slot] == view && !disallow_early_out) if (samplers->views[slot] == view && !disallow_early_out)
return; return;
if (view) { if (view) {
struct r600_texture *rtex = (struct r600_texture *)view->texture; struct r600_texture *rtex = (struct r600_texture *)view->texture;
si_set_sampler_view_desc(sctx, rview, si_set_sampler_view_desc(sctx, rview,
views->sampler_states[slot], desc); samplers->sampler_states[slot], desc);
if (rtex->resource.b.b.target == PIPE_BUFFER) { if (rtex->resource.b.b.target == PIPE_BUFFER) {
rtex->resource.bind_history |= PIPE_BIND_SAMPLER_VIEW; rtex->resource.bind_history |= PIPE_BIND_SAMPLER_VIEW;
@@ -502,8 +501,8 @@ static void si_set_sampler_view(struct si_context *sctx,
sctx->need_check_render_feedback = true; sctx->need_check_render_feedback = true;
} }
pipe_sampler_view_reference(&views->views[slot], view); pipe_sampler_view_reference(&samplers->views[slot], view);
views->enabled_mask |= 1u << slot; samplers->enabled_mask |= 1u << slot;
/* Since this can flush, it must be done after enabled_mask is /* Since this can flush, it must be done after enabled_mask is
* updated. */ * updated. */
@@ -511,16 +510,16 @@ static void si_set_sampler_view(struct si_context *sctx,
RADEON_USAGE_READ, RADEON_USAGE_READ,
rview->is_stencil_sampler, true); rview->is_stencil_sampler, true);
} else { } else {
pipe_sampler_view_reference(&views->views[slot], NULL); pipe_sampler_view_reference(&samplers->views[slot], NULL);
memcpy(desc, null_texture_descriptor, 8*4); memcpy(desc, null_texture_descriptor, 8*4);
/* Only clear the lower dwords of FMASK. */ /* Only clear the lower dwords of FMASK. */
memcpy(desc + 8, null_texture_descriptor, 4*4); memcpy(desc + 8, null_texture_descriptor, 4*4);
/* Re-set the sampler state if we are transitioning from FMASK. */ /* Re-set the sampler state if we are transitioning from FMASK. */
if (views->sampler_states[slot]) if (samplers->sampler_states[slot])
si_set_sampler_state_desc(views->sampler_states[slot], NULL, NULL, si_set_sampler_state_desc(samplers->sampler_states[slot], NULL, NULL,
desc + 12); desc + 12);
views->enabled_mask &= ~(1u << slot); samplers->enabled_mask &= ~(1u << slot);
samplers->needs_depth_decompress_mask &= ~(1u << slot); samplers->needs_depth_decompress_mask &= ~(1u << slot);
samplers->needs_color_decompress_mask &= ~(1u << slot); samplers->needs_color_decompress_mask &= ~(1u << slot);
} }
@@ -567,11 +566,11 @@ static void si_set_sampler_views(struct pipe_context *ctx,
static void static void
si_samplers_update_needs_color_decompress_mask(struct si_samplers *samplers) si_samplers_update_needs_color_decompress_mask(struct si_samplers *samplers)
{ {
unsigned mask = samplers->views.enabled_mask; unsigned mask = samplers->enabled_mask;
while (mask) { while (mask) {
int i = u_bit_scan(&mask); int i = u_bit_scan(&mask);
struct pipe_resource *res = samplers->views.views[i]->texture; struct pipe_resource *res = samplers->views[i]->texture;
if (res && res->target != PIPE_BUFFER) { if (res && res->target != PIPE_BUFFER) {
struct r600_texture *rtex = (struct r600_texture *)res; struct r600_texture *rtex = (struct r600_texture *)res;
@@ -842,19 +841,19 @@ static void si_bind_sampler_states(struct pipe_context *ctx,
unsigned desc_slot = si_get_sampler_slot(slot); unsigned desc_slot = si_get_sampler_slot(slot);
if (!sstates[i] || if (!sstates[i] ||
sstates[i] == samplers->views.sampler_states[slot]) sstates[i] == samplers->sampler_states[slot])
continue; continue;
#ifdef DEBUG #ifdef DEBUG
assert(sstates[i]->magic == SI_SAMPLER_STATE_MAGIC); assert(sstates[i]->magic == SI_SAMPLER_STATE_MAGIC);
#endif #endif
samplers->views.sampler_states[slot] = sstates[i]; samplers->sampler_states[slot] = sstates[i];
/* If FMASK is bound, don't overwrite it. /* If FMASK is bound, don't overwrite it.
* The sampler state will be set after FMASK is unbound. * The sampler state will be set after FMASK is unbound.
*/ */
struct si_sampler_view *sview = struct si_sampler_view *sview =
(struct si_sampler_view *)samplers->views.views[slot]; (struct si_sampler_view *)samplers->views[slot];
struct r600_texture *tex = NULL; struct r600_texture *tex = NULL;
@@ -1683,14 +1682,14 @@ static void si_rebind_buffer(struct pipe_context *ctx, struct pipe_resource *buf
if (rbuffer->bind_history & PIPE_BIND_SAMPLER_VIEW) { if (rbuffer->bind_history & PIPE_BIND_SAMPLER_VIEW) {
/* Texture buffers - update bindings. */ /* Texture buffers - update bindings. */
for (shader = 0; shader < SI_NUM_SHADERS; shader++) { for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
struct si_sampler_views *views = &sctx->samplers[shader].views; struct si_samplers *samplers = &sctx->samplers[shader];
struct si_descriptors *descs = struct si_descriptors *descs =
si_sampler_and_image_descriptors(sctx, shader); si_sampler_and_image_descriptors(sctx, shader);
unsigned mask = views->enabled_mask; unsigned mask = samplers->enabled_mask;
while (mask) { while (mask) {
unsigned i = u_bit_scan(&mask); unsigned i = u_bit_scan(&mask);
if (views->views[i]->texture == buf) { if (samplers->views[i]->texture == buf) {
unsigned desc_slot = si_get_sampler_slot(i); unsigned desc_slot = si_get_sampler_slot(i);
si_desc_reset_buffer_offset(ctx, si_desc_reset_buffer_offset(ctx,
@@ -1948,7 +1947,7 @@ void si_update_all_texture_descriptors(struct si_context *sctx)
unsigned shader; unsigned shader;
for (shader = 0; shader < SI_NUM_SHADERS; shader++) { for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
struct si_sampler_views *samplers = &sctx->samplers[shader].views; struct si_samplers *samplers = &sctx->samplers[shader];
struct si_images *images = &sctx->images[shader]; struct si_images *images = &sctx->images[shader];
unsigned mask; unsigned mask;
@@ -2771,7 +2770,7 @@ void si_release_all_descriptors(struct si_context *sctx)
for (i = 0; i < SI_NUM_SHADERS; i++) { for (i = 0; i < SI_NUM_SHADERS; i++) {
si_release_buffer_resources(&sctx->const_and_shader_buffers[i], si_release_buffer_resources(&sctx->const_and_shader_buffers[i],
si_const_and_shader_buffer_descriptors(sctx, i)); si_const_and_shader_buffer_descriptors(sctx, i));
si_release_sampler_views(&sctx->samplers[i].views); si_release_sampler_views(&sctx->samplers[i]);
si_release_image_views(&sctx->images[i]); si_release_image_views(&sctx->images[i]);
} }
si_release_buffer_resources(&sctx->rw_buffers, si_release_buffer_resources(&sctx->rw_buffers,
@@ -2793,7 +2792,7 @@ void si_all_descriptors_begin_new_cs(struct si_context *sctx)
for (i = 0; i < SI_NUM_SHADERS; i++) { for (i = 0; i < SI_NUM_SHADERS; i++) {
si_buffer_resources_begin_new_cs(sctx, &sctx->const_and_shader_buffers[i]); si_buffer_resources_begin_new_cs(sctx, &sctx->const_and_shader_buffers[i]);
si_sampler_views_begin_new_cs(sctx, &sctx->samplers[i].views); si_sampler_views_begin_new_cs(sctx, &sctx->samplers[i]);
si_image_views_begin_new_cs(sctx, &sctx->images[i]); si_image_views_begin_new_cs(sctx, &sctx->images[i]);
} }
si_buffer_resources_begin_new_cs(sctx, &sctx->rw_buffers); si_buffer_resources_begin_new_cs(sctx, &sctx->rw_buffers);

View File

@@ -182,7 +182,11 @@ struct si_cs_shader_state {
}; };
struct si_samplers { struct si_samplers {
struct si_sampler_views views; struct pipe_sampler_view *views[SI_NUM_SAMPLERS];
struct si_sampler_state *sampler_states[SI_NUM_SAMPLERS];
/* The i-th bit is set if that element is enabled (non-NULL resource). */
unsigned enabled_mask;
uint32_t needs_depth_decompress_mask; uint32_t needs_depth_decompress_mask;
uint32_t needs_color_decompress_mask; uint32_t needs_color_decompress_mask;
}; };

View File

@@ -276,14 +276,6 @@ struct si_descriptors {
ubyte shader_userdata_offset; ubyte shader_userdata_offset;
}; };
struct si_sampler_views {
struct pipe_sampler_view *views[SI_NUM_SAMPLERS];
struct si_sampler_state *sampler_states[SI_NUM_SAMPLERS];
/* The i-th bit is set if that element is enabled (non-NULL resource). */
unsigned enabled_mask;
};
struct si_buffer_resources { struct si_buffer_resources {
struct pipe_resource **buffers; /* this has num_buffers elements */ struct pipe_resource **buffers; /* this has num_buffers elements */