[Mesa-dev] [PATCH 19/20] st/mesa: don't store non-fragment sampler states and views in st_context
Marek Olšák
maraeo at gmail.com
Tue Nov 21 18:02:01 UTC 2017
From: Marek Olšák <marek.olsak at amd.com>
those are unused.
st_context: 10120 -> 3704 bytes
---
src/mesa/state_tracker/st_atom_sampler.c | 35 +++++++++----------
src/mesa/state_tracker/st_atom_texture.c | 56 +++++++++++++++++--------------
src/mesa/state_tracker/st_cb_bitmap.c | 8 ++---
src/mesa/state_tracker/st_cb_drawpixels.c | 8 ++---
src/mesa/state_tracker/st_context.c | 10 +++---
src/mesa/state_tracker/st_context.h | 6 ++--
6 files changed, 61 insertions(+), 62 deletions(-)
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 6d83f96..289856c 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -251,27 +251,32 @@ update_shader_samplers(struct st_context *st,
enum pipe_shader_type shader_stage,
const struct gl_program *prog,
struct pipe_sampler_state *samplers,
unsigned *out_num_samplers)
{
struct gl_context *ctx = st->ctx;
GLbitfield samplers_used = prog->SamplersUsed;
GLbitfield free_slots = ~prog->SamplersUsed;
GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
unsigned unit, num_samplers;
+ struct pipe_sampler_state local_samplers[PIPE_MAX_SAMPLERS];
const struct pipe_sampler_state *states[PIPE_MAX_SAMPLERS];
if (samplers_used == 0x0) {
- *out_num_samplers = 0;
+ if (out_num_samplers)
+ *out_num_samplers = 0;
return;
}
+ if (!samplers)
+ samplers = local_samplers;
+
num_samplers = util_last_bit(samplers_used);
/* loop over sampler units (aka tex image units) */
for (unit = 0; samplers_used; unit++, samplers_used >>= 1) {
struct pipe_sampler_state *sampler = samplers + unit;
unsigned tex_unit = prog->SamplerUnits[unit];
/* Don't update the sampler for TBOs. cso_context will not bind sampler
* states that are NULL.
*/
@@ -313,98 +318,90 @@ update_shader_samplers(struct st_context *st,
states[extra] = sampler;
break;
default:
break;
}
num_samplers = MAX2(num_samplers, extra + 1);
}
cso_set_samplers(st->cso_context, shader_stage, num_samplers, states);
- *out_num_samplers = num_samplers;
+
+ if (out_num_samplers)
+ *out_num_samplers = num_samplers;
}
void
st_update_vertex_samplers(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
update_shader_samplers(st,
PIPE_SHADER_VERTEX,
- ctx->VertexProgram._Current,
- st->state.samplers[PIPE_SHADER_VERTEX],
- &st->state.num_samplers[PIPE_SHADER_VERTEX]);
+ ctx->VertexProgram._Current, NULL, NULL);
}
void
st_update_tessctrl_samplers(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->TessCtrlProgram._Current) {
update_shader_samplers(st,
PIPE_SHADER_TESS_CTRL,
- ctx->TessCtrlProgram._Current,
- st->state.samplers[PIPE_SHADER_TESS_CTRL],
- &st->state.num_samplers[PIPE_SHADER_TESS_CTRL]);
+ ctx->TessCtrlProgram._Current, NULL, NULL);
}
}
void
st_update_tesseval_samplers(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->TessEvalProgram._Current) {
update_shader_samplers(st,
PIPE_SHADER_TESS_EVAL,
- ctx->TessEvalProgram._Current,
- st->state.samplers[PIPE_SHADER_TESS_EVAL],
- &st->state.num_samplers[PIPE_SHADER_TESS_EVAL]);
+ ctx->TessEvalProgram._Current, NULL, NULL);
}
}
void
st_update_geometry_samplers(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->GeometryProgram._Current) {
update_shader_samplers(st,
PIPE_SHADER_GEOMETRY,
- ctx->GeometryProgram._Current,
- st->state.samplers[PIPE_SHADER_GEOMETRY],
- &st->state.num_samplers[PIPE_SHADER_GEOMETRY]);
+ ctx->GeometryProgram._Current, NULL, NULL);
}
}
void
st_update_fragment_samplers(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
update_shader_samplers(st,
PIPE_SHADER_FRAGMENT,
ctx->FragmentProgram._Current,
- st->state.samplers[PIPE_SHADER_FRAGMENT],
- &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
+ st->state.frag_samplers,
+ &st->state.num_frag_samplers);
}
void
st_update_compute_samplers(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->ComputeProgram._Current) {
update_shader_samplers(st,
PIPE_SHADER_COMPUTE,
- ctx->ComputeProgram._Current,
- st->state.samplers[PIPE_SHADER_COMPUTE],
- &st->state.num_samplers[PIPE_SHADER_COMPUTE]);
+ ctx->ComputeProgram._Current, NULL, NULL);
}
}
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index 6c26b77..105fa79 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -209,98 +209,102 @@ update_textures(struct st_context *st,
num_textures = MAX2(num_textures, extra + 1);
}
cso_set_sampler_views(st->cso_context,
shader_stage,
num_textures,
sampler_views);
*out_num_textures = num_textures;
}
+/* Same as update_textures, but don't store the views in st_context. */
+static void
+update_textures_local(struct st_context *st,
+ enum pipe_shader_type shader_stage,
+ const struct gl_program *prog,
+ unsigned *out_num_textures)
+{
+ struct pipe_sampler_view *local_views[PIPE_MAX_SAMPLERS] = {0};
+ update_textures(st, shader_stage, prog, local_views, out_num_textures);
+
+ unsigned num = *out_num_textures;
+ for (unsigned i = 0; i < num; i++)
+ pipe_sampler_view_reference(&local_views[i], NULL);
+}
void
st_update_vertex_textures(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
- update_textures(st,
- PIPE_SHADER_VERTEX,
- ctx->VertexProgram._Current,
- st->state.sampler_views[PIPE_SHADER_VERTEX],
- &st->state.num_sampler_views[PIPE_SHADER_VERTEX]);
+ update_textures_local(st, PIPE_SHADER_VERTEX,
+ ctx->VertexProgram._Current,
+ &st->state.num_sampler_views[PIPE_SHADER_VERTEX]);
}
}
void
st_update_fragment_textures(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
update_textures(st,
PIPE_SHADER_FRAGMENT,
ctx->FragmentProgram._Current,
- st->state.sampler_views[PIPE_SHADER_FRAGMENT],
+ st->state.frag_sampler_views,
&st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
}
void
st_update_geometry_textures(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->GeometryProgram._Current) {
- update_textures(st,
- PIPE_SHADER_GEOMETRY,
- ctx->GeometryProgram._Current,
- st->state.sampler_views[PIPE_SHADER_GEOMETRY],
- &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]);
+ update_textures_local(st, PIPE_SHADER_GEOMETRY,
+ ctx->GeometryProgram._Current,
+ &st->state.num_sampler_views[PIPE_SHADER_GEOMETRY]);
}
}
void
st_update_tessctrl_textures(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->TessCtrlProgram._Current) {
- update_textures(st,
- PIPE_SHADER_TESS_CTRL,
- ctx->TessCtrlProgram._Current,
- st->state.sampler_views[PIPE_SHADER_TESS_CTRL],
- &st->state.num_sampler_views[PIPE_SHADER_TESS_CTRL]);
+ update_textures_local(st, PIPE_SHADER_TESS_CTRL,
+ ctx->TessCtrlProgram._Current,
+ &st->state.num_sampler_views[PIPE_SHADER_TESS_CTRL]);
}
}
void
st_update_tesseval_textures(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->TessEvalProgram._Current) {
- update_textures(st,
- PIPE_SHADER_TESS_EVAL,
- ctx->TessEvalProgram._Current,
- st->state.sampler_views[PIPE_SHADER_TESS_EVAL],
- &st->state.num_sampler_views[PIPE_SHADER_TESS_EVAL]);
+ update_textures_local(st, PIPE_SHADER_TESS_EVAL,
+ ctx->TessEvalProgram._Current,
+ &st->state.num_sampler_views[PIPE_SHADER_TESS_EVAL]);
}
}
void
st_update_compute_textures(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
if (ctx->ComputeProgram._Current) {
- update_textures(st,
- PIPE_SHADER_COMPUTE,
- ctx->ComputeProgram._Current,
- st->state.sampler_views[PIPE_SHADER_COMPUTE],
- &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]);
+ update_textures_local(st, PIPE_SHADER_COMPUTE,
+ ctx->ComputeProgram._Current,
+ &st->state.num_sampler_views[PIPE_SHADER_COMPUTE]);
}
}
diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
index a5c7ed0..0a30ffa 100644
--- a/src/mesa/state_tracker/st_cb_bitmap.c
+++ b/src/mesa/state_tracker/st_cb_bitmap.c
@@ -217,39 +217,39 @@ setup_render_state(struct gl_context *ctx,
/* disable other shaders */
cso_set_tessctrl_shader_handle(cso, NULL);
cso_set_tesseval_shader_handle(cso, NULL);
cso_set_geometry_shader_handle(cso, NULL);
/* user samplers, plus our bitmap sampler */
{
struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
uint num = MAX2(fpv->bitmap_sampler + 1,
- st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
+ st->state.num_frag_samplers);
uint i;
- for (i = 0; i < st->state.num_samplers[PIPE_SHADER_FRAGMENT]; i++) {
- samplers[i] = &st->state.samplers[PIPE_SHADER_FRAGMENT][i];
+ for (i = 0; i < st->state.num_frag_samplers; i++) {
+ samplers[i] = &st->state.frag_samplers[i];
}
if (atlas)
samplers[fpv->bitmap_sampler] = &st->bitmap.atlas_sampler;
else
samplers[fpv->bitmap_sampler] = &st->bitmap.sampler;
cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, num,
(const struct pipe_sampler_state **) samplers);
}
/* user textures, plus the bitmap texture */
{
struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
uint num = MAX2(fpv->bitmap_sampler + 1,
st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
- memcpy(sampler_views, st->state.sampler_views[PIPE_SHADER_FRAGMENT],
+ memcpy(sampler_views, st->state.frag_sampler_views,
sizeof(sampler_views));
sampler_views[fpv->bitmap_sampler] = sv;
cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, num, sampler_views);
}
/* viewport state: viewport matching window dims */
cso_set_viewport_dims(cso, st->state.fb_width,
st->state.fb_height,
st->state.fb_orientation == Y_0_TOP);
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 1d88976..7693b2f 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -659,25 +659,25 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST;
sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
sampler.normalized_coords = normalized;
if (fpv) {
/* drawing a color image */
const struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
uint num = MAX3(fpv->drawpix_sampler + 1,
fpv->pixelmap_sampler + 1,
- st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
+ st->state.num_frag_samplers);
uint i;
- for (i = 0; i < st->state.num_samplers[PIPE_SHADER_FRAGMENT]; i++)
- samplers[i] = &st->state.samplers[PIPE_SHADER_FRAGMENT][i];
+ for (i = 0; i < st->state.num_frag_samplers; i++)
+ samplers[i] = &st->state.frag_samplers[i];
samplers[fpv->drawpix_sampler] = &sampler;
if (sv[1])
samplers[fpv->pixelmap_sampler] = &sampler;
cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, num, samplers);
} else {
/* drawing a depth/stencil image */
const struct pipe_sampler_state *samplers[2] = {&sampler, &sampler};
@@ -686,21 +686,21 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
}
/* user textures, plus the drawpix textures */
if (fpv) {
/* drawing a color image */
struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
uint num = MAX3(fpv->drawpix_sampler + 1,
fpv->pixelmap_sampler + 1,
st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
- memcpy(sampler_views, st->state.sampler_views[PIPE_SHADER_FRAGMENT],
+ memcpy(sampler_views, st->state.frag_sampler_views,
sizeof(sampler_views));
sampler_views[fpv->drawpix_sampler] = sv[0];
if (sv[1])
sampler_views[fpv->pixelmap_sampler] = sv[1];
cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, num, sampler_views);
} else {
/* drawing a depth/stencil image */
cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, num_sampler_view, sv);
}
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index da1cca4..c65bd20 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -245,38 +245,36 @@ st_invalidate_state(struct gl_context *ctx)
ctx->FragmentProgram._Current->ExternalSamplersUsed) {
st->dirty |= ST_NEW_FS_STATE;
}
}
}
static void
st_destroy_context_priv(struct st_context *st, bool destroy_pipe)
{
- uint shader, i;
+ uint i;
st_destroy_atoms(st);
st_destroy_draw(st);
st_destroy_clear(st);
st_destroy_bitmap(st);
st_destroy_drawpix(st);
st_destroy_drawtex(st);
st_destroy_perfmon(st);
st_destroy_pbo_helpers(st);
st_destroy_bound_texture_handles(st);
st_destroy_bound_image_handles(st);
- for (shader = 0; shader < ARRAY_SIZE(st->state.sampler_views); shader++) {
- for (i = 0; i < ARRAY_SIZE(st->state.sampler_views[0]); i++) {
- pipe_sampler_view_release(st->pipe,
- &st->state.sampler_views[shader][i]);
- }
+ for (i = 0; i < ARRAY_SIZE(st->state.frag_sampler_views); i++) {
+ pipe_sampler_view_release(st->pipe,
+ &st->state.frag_sampler_views[i]);
}
/* free glDrawPixels cache data */
free(st->drawpix_cache.image);
pipe_resource_reference(&st->drawpix_cache.texture, NULL);
/* free glReadPixels cache data */
st_invalidate_readpix_cache(st);
cso_destroy_context(st->cso_context);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 9f33eed..f1da18b 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -131,23 +131,23 @@ struct st_context
boolean vertex_array_out_of_memory;
boolean has_hw_atomics;
/* Some state is contained in constant objects.
* Other state is just parameter values.
*/
struct {
struct pipe_blend_state blend;
struct pipe_depth_stencil_alpha_state depth_stencil;
struct pipe_rasterizer_state rasterizer;
- struct pipe_sampler_state samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
- GLuint num_samplers[PIPE_SHADER_TYPES];
- struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
+ struct pipe_sampler_state frag_samplers[PIPE_MAX_SAMPLERS];
+ GLuint num_frag_samplers;
+ struct pipe_sampler_view *frag_sampler_views[PIPE_MAX_SAMPLERS];
GLuint num_sampler_views[PIPE_SHADER_TYPES];
struct pipe_clip_state clip;
struct {
void *ptr;
unsigned size;
} constants[PIPE_SHADER_TYPES];
unsigned fb_width;
unsigned fb_height;
unsigned fb_num_samples;
unsigned fb_num_layers;
--
2.7.4
More information about the mesa-dev
mailing list