radeonsi: add new si_check_render_feedback_texture() helper
For bindless. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -527,25 +527,17 @@ si_decompress_image_color_textures(struct si_context *sctx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void si_check_render_feedback_textures(struct si_context *sctx,
|
static void si_check_render_feedback_texture(struct si_context *sctx,
|
||||||
struct si_textures_info *textures)
|
struct r600_texture *tex,
|
||||||
|
unsigned first_level,
|
||||||
|
unsigned last_level,
|
||||||
|
unsigned first_layer,
|
||||||
|
unsigned last_layer)
|
||||||
{
|
{
|
||||||
uint32_t mask = textures->views.enabled_mask;
|
|
||||||
|
|
||||||
while (mask) {
|
|
||||||
const struct pipe_sampler_view *view;
|
|
||||||
struct r600_texture *tex;
|
|
||||||
bool render_feedback = false;
|
bool render_feedback = false;
|
||||||
|
|
||||||
unsigned i = u_bit_scan(&mask);
|
|
||||||
|
|
||||||
view = textures->views.views[i];
|
|
||||||
if(view->texture->target == PIPE_BUFFER)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
tex = (struct r600_texture *)view->texture;
|
|
||||||
if (!tex->dcc_offset)
|
if (!tex->dcc_offset)
|
||||||
continue;
|
return;
|
||||||
|
|
||||||
for (unsigned j = 0; j < sctx->framebuffer.state.nr_cbufs; ++j) {
|
for (unsigned j = 0; j < sctx->framebuffer.state.nr_cbufs; ++j) {
|
||||||
struct r600_surface * surf;
|
struct r600_surface * surf;
|
||||||
@@ -555,11 +547,11 @@ static void si_check_render_feedback_textures(struct si_context *sctx,
|
|||||||
|
|
||||||
surf = (struct r600_surface*)sctx->framebuffer.state.cbufs[j];
|
surf = (struct r600_surface*)sctx->framebuffer.state.cbufs[j];
|
||||||
|
|
||||||
if (tex == (struct r600_texture*)surf->base.texture &&
|
if (tex == (struct r600_texture *)surf->base.texture &&
|
||||||
surf->base.u.tex.level >= view->u.tex.first_level &&
|
surf->base.u.tex.level >= first_level &&
|
||||||
surf->base.u.tex.level <= view->u.tex.last_level &&
|
surf->base.u.tex.level <= last_level &&
|
||||||
surf->base.u.tex.first_layer <= view->u.tex.last_layer &&
|
surf->base.u.tex.first_layer <= last_layer &&
|
||||||
surf->base.u.tex.last_layer >= view->u.tex.first_layer) {
|
surf->base.u.tex.last_layer >= first_layer) {
|
||||||
render_feedback = true;
|
render_feedback = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -567,6 +559,30 @@ static void si_check_render_feedback_textures(struct si_context *sctx,
|
|||||||
|
|
||||||
if (render_feedback)
|
if (render_feedback)
|
||||||
r600_texture_disable_dcc(&sctx->b, tex);
|
r600_texture_disable_dcc(&sctx->b, tex);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void si_check_render_feedback_textures(struct si_context *sctx,
|
||||||
|
struct si_textures_info *textures)
|
||||||
|
{
|
||||||
|
uint32_t mask = textures->views.enabled_mask;
|
||||||
|
|
||||||
|
while (mask) {
|
||||||
|
const struct pipe_sampler_view *view;
|
||||||
|
struct r600_texture *tex;
|
||||||
|
|
||||||
|
unsigned i = u_bit_scan(&mask);
|
||||||
|
|
||||||
|
view = textures->views.views[i];
|
||||||
|
if(view->texture->target == PIPE_BUFFER)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tex = (struct r600_texture *)view->texture;
|
||||||
|
|
||||||
|
si_check_render_feedback_texture(sctx, tex,
|
||||||
|
view->u.tex.first_level,
|
||||||
|
view->u.tex.last_level,
|
||||||
|
view->u.tex.first_layer,
|
||||||
|
view->u.tex.last_layer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,7 +594,6 @@ static void si_check_render_feedback_images(struct si_context *sctx,
|
|||||||
while (mask) {
|
while (mask) {
|
||||||
const struct pipe_image_view *view;
|
const struct pipe_image_view *view;
|
||||||
struct r600_texture *tex;
|
struct r600_texture *tex;
|
||||||
bool render_feedback = false;
|
|
||||||
|
|
||||||
unsigned i = u_bit_scan(&mask);
|
unsigned i = u_bit_scan(&mask);
|
||||||
|
|
||||||
@@ -587,28 +602,12 @@ static void si_check_render_feedback_images(struct si_context *sctx,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
tex = (struct r600_texture *)view->resource;
|
tex = (struct r600_texture *)view->resource;
|
||||||
if (!tex->dcc_offset)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (unsigned j = 0; j < sctx->framebuffer.state.nr_cbufs; ++j) {
|
si_check_render_feedback_texture(sctx, tex,
|
||||||
struct r600_surface * surf;
|
view->u.tex.level,
|
||||||
|
view->u.tex.level,
|
||||||
if (!sctx->framebuffer.state.cbufs[j])
|
view->u.tex.first_layer,
|
||||||
continue;
|
view->u.tex.last_layer);
|
||||||
|
|
||||||
surf = (struct r600_surface*)sctx->framebuffer.state.cbufs[j];
|
|
||||||
|
|
||||||
if (tex == (struct r600_texture*)surf->base.texture &&
|
|
||||||
surf->base.u.tex.level == view->u.tex.level &&
|
|
||||||
surf->base.u.tex.first_layer <= view->u.tex.last_layer &&
|
|
||||||
surf->base.u.tex.last_layer >= view->u.tex.first_layer) {
|
|
||||||
render_feedback = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (render_feedback)
|
|
||||||
r600_texture_disable_dcc(&sctx->b, tex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user