2016-02-08 18:07 GMT+01:00 Brian Paul <bri...@vmware.com>: > Most apps don't use glBitmap so don't allocate the bitmap cache or > gallium state objects/shaders/etc until the first call to st_Bitmap(). > --- > src/mesa/state_tracker/st_cb_bitmap.c | 145 > ++++++++++++++++++---------------- > src/mesa/state_tracker/st_cb_bitmap.h | 3 - > src/mesa/state_tracker/st_context.c | 1 - > 3 files changed, 77 insertions(+), 72 deletions(-) > > diff --git a/src/mesa/state_tracker/st_cb_bitmap.c > b/src/mesa/state_tracker/st_cb_bitmap.c > index c26ee7f..ca1dfab 100644 > --- a/src/mesa/state_tracker/st_cb_bitmap.c > +++ b/src/mesa/state_tracker/st_cb_bitmap.c > @@ -497,8 +497,9 @@ create_cache_trans(struct st_context *st) > void > st_flush_bitmap_cache(struct st_context *st) > { > - if (!st->bitmap.cache->empty) { > - struct bitmap_cache *cache = st->bitmap.cache; > + struct bitmap_cache *cache = st->bitmap.cache; > + > + if (cache && !st->bitmap.cache->empty) { Maybe do the following:
if (cache && !cache->empty) { > struct pipe_context *pipe = st->pipe; > struct pipe_sampler_view *sv; > > @@ -617,6 +618,76 @@ accum_bitmap(struct gl_context *ctx, > } > > > +/** > + * One-time init for drawing bitmaps. > + */ > +static void > +init_bitmap_state(struct st_context *st) > +{ > + struct pipe_sampler_state *sampler = &st->bitmap.samplers[0]; > + struct pipe_context *pipe = st->pipe; > + struct pipe_screen *screen = pipe->screen; > + > + /* This function should only be called once */ > + assert(st->bitmap.cache == NULL); > + > + /* alloc bitmap cache object */ > + st->bitmap.cache = ST_CALLOC_STRUCT(bitmap_cache); > + > + /* init sampler state once */ > + memset(sampler, 0, sizeof(*sampler)); > + sampler->wrap_s = PIPE_TEX_WRAP_CLAMP; > + sampler->wrap_t = PIPE_TEX_WRAP_CLAMP; > + sampler->wrap_r = PIPE_TEX_WRAP_CLAMP; > + sampler->min_img_filter = PIPE_TEX_FILTER_NEAREST; > + sampler->min_mip_filter = PIPE_TEX_MIPFILTER_NONE; > + sampler->mag_img_filter = PIPE_TEX_FILTER_NEAREST; > + st->bitmap.samplers[1] = *sampler; > + st->bitmap.samplers[1].normalized_coords = 1; > + > + /* init baseline rasterizer state once */ > + memset(&st->bitmap.rasterizer, 0, sizeof(st->bitmap.rasterizer)); > + st->bitmap.rasterizer.half_pixel_center = 1; > + st->bitmap.rasterizer.bottom_edge_rule = 1; > + st->bitmap.rasterizer.depth_clip = 1; > + > + /* find a usable texture format */ > + if (screen->is_format_supported(screen, PIPE_FORMAT_I8_UNORM, > + PIPE_TEXTURE_2D, 0, > + PIPE_BIND_SAMPLER_VIEW)) { > + st->bitmap.tex_format = PIPE_FORMAT_I8_UNORM; > + } > + else if (screen->is_format_supported(screen, PIPE_FORMAT_A8_UNORM, > + PIPE_TEXTURE_2D, 0, > + PIPE_BIND_SAMPLER_VIEW)) { > + st->bitmap.tex_format = PIPE_FORMAT_A8_UNORM; > + } > + else if (screen->is_format_supported(screen, PIPE_FORMAT_L8_UNORM, > + PIPE_TEXTURE_2D, 0, > + PIPE_BIND_SAMPLER_VIEW)) { > + st->bitmap.tex_format = PIPE_FORMAT_L8_UNORM; > + } > + else { > + /* XXX support more formats */ > + assert(0); > + } > + > + /* Create the vertex shader */ > + { > + const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, > + TGSI_SEMANTIC_COLOR, > + st->needs_texcoord_semantic ? TGSI_SEMANTIC_TEXCOORD : > + TGSI_SEMANTIC_GENERIC }; > + const uint semantic_indexes[] = { 0, 0, 0 }; > + st->bitmap.vs = util_make_vertex_passthrough_shader(st->pipe, 3, > + semantic_names, > + semantic_indexes, > + FALSE); > + } > + > + reset_cache(st); > +} > + > > /** > * Called via ctx->Driver.Bitmap() > @@ -632,6 +703,10 @@ st_Bitmap(struct gl_context *ctx, GLint x, GLint y, > assert(width > 0); > assert(height > 0); > > + if (!st->bitmap.cache) { > + init_bitmap_state(st); > + } > + > /* We only need to validate state of the st dirty flags are set or > * any non-_NEW_PROGRAM_CONSTANTS mesa flags are set. The VS we use > * for bitmap drawing uses no constants and the FS constants are > @@ -641,19 +716,6 @@ st_Bitmap(struct gl_context *ctx, GLint x, GLint y, > st_validate_state(st); > } > > - if (!st->bitmap.vs) { > - /* create pass-through vertex shader now */ > - const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, > - TGSI_SEMANTIC_COLOR, > - st->needs_texcoord_semantic ? TGSI_SEMANTIC_TEXCOORD : > - TGSI_SEMANTIC_GENERIC }; > - const uint semantic_indexes[] = { 0, 0, 0 }; > - st->bitmap.vs = util_make_vertex_passthrough_shader(st->pipe, 3, > - semantic_names, > - semantic_indexes, > - FALSE); > - } > - > if (UseBitmapCache && accum_bitmap(ctx, x, y, width, height, unpack, > bitmap)) > return; > > @@ -686,59 +748,6 @@ st_init_bitmap_functions(struct dd_function_table > *functions) > } > > > -/** Per-context init */ > -void > -st_init_bitmap(struct st_context *st) > -{ > - struct pipe_sampler_state *sampler = &st->bitmap.samplers[0]; > - struct pipe_context *pipe = st->pipe; > - struct pipe_screen *screen = pipe->screen; > - > - /* init sampler state once */ > - memset(sampler, 0, sizeof(*sampler)); > - sampler->wrap_s = PIPE_TEX_WRAP_CLAMP; > - sampler->wrap_t = PIPE_TEX_WRAP_CLAMP; > - sampler->wrap_r = PIPE_TEX_WRAP_CLAMP; > - sampler->min_img_filter = PIPE_TEX_FILTER_NEAREST; > - sampler->min_mip_filter = PIPE_TEX_MIPFILTER_NONE; > - sampler->mag_img_filter = PIPE_TEX_FILTER_NEAREST; > - st->bitmap.samplers[1] = *sampler; > - st->bitmap.samplers[1].normalized_coords = 1; > - > - /* init baseline rasterizer state once */ > - memset(&st->bitmap.rasterizer, 0, sizeof(st->bitmap.rasterizer)); > - st->bitmap.rasterizer.half_pixel_center = 1; > - st->bitmap.rasterizer.bottom_edge_rule = 1; > - st->bitmap.rasterizer.depth_clip = 1; > - > - /* find a usable texture format */ > - if (screen->is_format_supported(screen, PIPE_FORMAT_I8_UNORM, > - PIPE_TEXTURE_2D, 0, > - PIPE_BIND_SAMPLER_VIEW)) { > - st->bitmap.tex_format = PIPE_FORMAT_I8_UNORM; > - } > - else if (screen->is_format_supported(screen, PIPE_FORMAT_A8_UNORM, > - PIPE_TEXTURE_2D, 0, > - PIPE_BIND_SAMPLER_VIEW)) { > - st->bitmap.tex_format = PIPE_FORMAT_A8_UNORM; > - } > - else if (screen->is_format_supported(screen, PIPE_FORMAT_L8_UNORM, > - PIPE_TEXTURE_2D, 0, > - PIPE_BIND_SAMPLER_VIEW)) { > - st->bitmap.tex_format = PIPE_FORMAT_L8_UNORM; > - } > - else { > - /* XXX support more formats */ > - assert(0); > - } > - > - /* alloc bitmap cache object */ > - st->bitmap.cache = ST_CALLOC_STRUCT(bitmap_cache); > - > - reset_cache(st); > -} > - > - > /** Per-context tear-down */ > void > st_destroy_bitmap(struct st_context *st) > diff --git a/src/mesa/state_tracker/st_cb_bitmap.h > b/src/mesa/state_tracker/st_cb_bitmap.h > index dc7e5cb..4d1ae22 100644 > --- a/src/mesa/state_tracker/st_cb_bitmap.h > +++ b/src/mesa/state_tracker/st_cb_bitmap.h > @@ -42,9 +42,6 @@ extern void > st_init_bitmap_functions(struct dd_function_table *functions); > > extern void > -st_init_bitmap(struct st_context *st); > - > -extern void > st_destroy_bitmap(struct st_context *st); > > extern void > diff --git a/src/mesa/state_tracker/st_context.c > b/src/mesa/state_tracker/st_context.c > index 446ebfb..9016846 100644 > --- a/src/mesa/state_tracker/st_context.c > +++ b/src/mesa/state_tracker/st_context.c > @@ -231,7 +231,6 @@ st_create_context_priv( struct gl_context *ctx, struct > pipe_context *pipe, > st->cso_context = cso_create_context(pipe); > > st_init_atoms( st ); > - st_init_bitmap(st); > st_init_clear(st); > st_init_draw( st ); > st_init_pbo_upload(st); > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev Regards, Gustaw Smolarczyk _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev