From: Marek Olšák <marek.ol...@amd.com> This is nicer on caches, and the next commit will need to access the structure from a different place. --- src/mesa/state_tracker/st_cb_bitmap.c | 54 +++++++++-------------------------- src/mesa/state_tracker/st_context.c | 2 ++ src/mesa/state_tracker/st_context.h | 23 +++++++++++++-- 3 files changed, 36 insertions(+), 43 deletions(-)
diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c index cf820e4..e0745f4 100644 --- a/src/mesa/state_tracker/st_cb_bitmap.c +++ b/src/mesa/state_tracker/st_cb_bitmap.c @@ -76,41 +76,20 @@ * buffer which is then rendered en mass upon a flush, state change, etc. * A wide, short buffer is used to target the common case of a series * of glBitmap calls being used to draw text. */ static GLboolean UseBitmapCache = GL_TRUE; #define BITMAP_CACHE_WIDTH 512 #define BITMAP_CACHE_HEIGHT 32 -struct bitmap_cache -{ - /** Window pos to render the cached image */ - GLint xpos, ypos; - /** Bounds of region used in window coords */ - GLint xmin, ymin, xmax, ymax; - - GLfloat color[4]; - - /** Bitmap's Z position */ - GLfloat zpos; - - struct pipe_resource *texture; - struct pipe_transfer *trans; - - GLboolean empty; - - /** An I8 texture image: */ - ubyte *buffer; -}; - /** Epsilon for Z comparisons */ #define Z_EPSILON 1e-06 /** * Copy user-provide bitmap bits into texture buffer, expanding * bits into texels. * "On" bits will set texels to 0x0. * "Off" bits will not modify texels. @@ -347,21 +326,21 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z, restore_render_state(ctx); /* We uploaded modified constants, need to invalidate them. */ st->dirty |= ST_NEW_FS_CONSTANTS; } static void reset_cache(struct st_context *st) { - struct bitmap_cache *cache = st->bitmap.cache; + struct st_bitmap_cache *cache = &st->bitmap.cache; /*memset(cache->buffer, 0xff, sizeof(cache->buffer));*/ cache->empty = GL_TRUE; cache->xmin = 1000000; cache->xmax = -1000000; cache->ymin = 1000000; cache->ymax = -1000000; assert(!cache->texture); @@ -370,21 +349,21 @@ reset_cache(struct st_context *st) cache->texture = st_texture_create(st, st->internal_target, st->bitmap.tex_format, 0, BITMAP_CACHE_WIDTH, BITMAP_CACHE_HEIGHT, 1, 1, 0, PIPE_BIND_SAMPLER_VIEW); } /** Print bitmap image to stdout (debug) */ static void -print_cache(const struct bitmap_cache *cache) +print_cache(const struct st_bitmap_cache *cache) { int i, j, k; for (i = 0; i < BITMAP_CACHE_HEIGHT; i++) { k = BITMAP_CACHE_WIDTH * (BITMAP_CACHE_HEIGHT - i - 1); for (j = 0; j < BITMAP_CACHE_WIDTH; j++) { if (cache->buffer[k]) printf("X"); else printf(" "); @@ -395,21 +374,21 @@ print_cache(const struct bitmap_cache *cache) } /** * Create gallium pipe_transfer object for the bitmap cache. */ static void create_cache_trans(struct st_context *st) { struct pipe_context *pipe = st->pipe; - struct bitmap_cache *cache = st->bitmap.cache; + struct st_bitmap_cache *cache = &st->bitmap.cache; if (cache->trans) return; /* Map the texture transfer. * Subsequent glBitmap calls will write into the texture image. */ cache->buffer = pipe_transfer_map(pipe, cache->texture, 0, 0, PIPE_TRANSFER_WRITE, 0, 0, BITMAP_CACHE_WIDTH, @@ -419,23 +398,23 @@ create_cache_trans(struct st_context *st) memset(cache->buffer, 0xff, cache->trans->stride * BITMAP_CACHE_HEIGHT); } /** * If there's anything in the bitmap cache, draw/flush it now. */ void st_flush_bitmap_cache(struct st_context *st) { - struct bitmap_cache *cache = st->bitmap.cache; + struct st_bitmap_cache *cache = &st->bitmap.cache; - if (cache && !cache->empty) { + if (!cache->empty) { struct pipe_context *pipe = st->pipe; struct pipe_sampler_view *sv; assert(cache->xmin <= cache->xmax); if (0) printf("flush bitmap, size %d x %d at %d, %d\n", cache->xmax - cache->xmin, cache->ymax - cache->ymin, cache->xpos, cache->ypos); @@ -476,21 +455,21 @@ st_flush_bitmap_cache(struct st_context *st) * Try to accumulate this glBitmap call in the bitmap cache. * \return GL_TRUE for success, GL_FALSE if bitmap is too large, etc. */ static GLboolean accum_bitmap(struct gl_context *ctx, GLint x, GLint y, GLsizei width, GLsizei height, const struct gl_pixelstore_attrib *unpack, const GLubyte *bitmap ) { struct st_context *st = ctx->st; - struct bitmap_cache *cache = st->bitmap.cache; + struct st_bitmap_cache *cache = &st->bitmap.cache; int px = -999, py = -999; const GLfloat z = ctx->Current.RasterPos[2]; if (width > BITMAP_CACHE_WIDTH || height > BITMAP_CACHE_HEIGHT) return GL_FALSE; /* too big to cache */ if (!cache->empty) { px = x - cache->xpos; /* pos in buffer */ py = y - cache->ypos; @@ -550,28 +529,25 @@ accum_bitmap(struct gl_context *ctx, /** * One-time init for drawing bitmaps. */ static void init_bitmap_state(struct st_context *st) { struct pipe_context *pipe = st->pipe; struct pipe_screen *screen = pipe->screen; /* This function should only be called once */ - assert(st->bitmap.cache == NULL); + assert(st->bitmap.vs == NULL); assert(st->internal_target == PIPE_TEXTURE_2D || st->internal_target == PIPE_TEXTURE_RECT); - /* alloc bitmap cache object */ - st->bitmap.cache = ST_CALLOC_STRUCT(bitmap_cache); - /* init sampler state once */ memset(&st->bitmap.sampler, 0, sizeof(st->bitmap.sampler)); st->bitmap.sampler.wrap_s = PIPE_TEX_WRAP_CLAMP; st->bitmap.sampler.wrap_t = PIPE_TEX_WRAP_CLAMP; st->bitmap.sampler.wrap_r = PIPE_TEX_WRAP_CLAMP; st->bitmap.sampler.min_img_filter = PIPE_TEX_FILTER_NEAREST; st->bitmap.sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE; st->bitmap.sampler.mag_img_filter = PIPE_TEX_FILTER_NEAREST; st->bitmap.sampler.normalized_coords = st->internal_target == PIPE_TEXTURE_2D; @@ -631,21 +607,21 @@ st_Bitmap(struct gl_context *ctx, GLint x, GLint y, const struct gl_pixelstore_attrib *unpack, const GLubyte *bitmap ) { struct st_context *st = st_context(ctx); struct pipe_resource *pt; assert(width > 0); assert(height > 0); st_invalidate_readpix_cache(st); - if (!st->bitmap.cache) { + if (!st->bitmap.vs) { init_bitmap_state(st); } /* We only need to validate any non-ST_NEW_CONSTANTS state. The VS we use * for bitmap drawing uses no constants and the FS constants are * explicitly uploaded in the draw_bitmap_quad() function. */ if ((st->dirty | ctx->NewDriverState) & ~ST_NEW_CONSTANTS & ST_PIPELINE_RENDER_STATE_MASK || st->gfx_shaders_may_be_dirty) { @@ -691,21 +667,21 @@ st_DrawAtlasBitmaps(struct gl_context *ctx, const float z = ctx->Current.RasterPos[2] * 2.0f - 1.0f; const float *color = ctx->Current.RasterColor; const float clip_x_scale = 2.0f / st->state.framebuffer.width; const float clip_y_scale = 2.0f / st->state.framebuffer.height; const unsigned num_verts = count * 4; const unsigned num_vert_bytes = num_verts * sizeof(struct st_util_vertex); struct st_util_vertex *verts; struct pipe_vertex_buffer vb = {0}; unsigned i; - if (!st->bitmap.cache) { + if (!st->bitmap.vs) { init_bitmap_state(st); } st_flush_bitmap_cache(st); st_validate_state(st, ST_PIPELINE_RENDER); st_invalidate_readpix_cache(st); sv = st_create_texture_sampler_view(pipe, stObj->pt); if (!sv) { @@ -822,26 +798,22 @@ st_init_bitmap_functions(struct dd_function_table *functions) functions->Bitmap = st_Bitmap; functions->DrawAtlasBitmaps = st_DrawAtlasBitmaps; } /** Per-context tear-down */ void st_destroy_bitmap(struct st_context *st) { struct pipe_context *pipe = st->pipe; - struct bitmap_cache *cache = st->bitmap.cache; + struct st_bitmap_cache *cache = &st->bitmap.cache; if (st->bitmap.vs) { cso_delete_vertex_shader(st->cso_context, st->bitmap.vs); st->bitmap.vs = NULL; } - if (cache) { - if (cache->trans && cache->buffer) { - pipe_transfer_unmap(pipe, cache->trans); - } - pipe_resource_reference(&st->bitmap.cache->texture, NULL); - free(st->bitmap.cache); - st->bitmap.cache = NULL; + if (cache->trans && cache->buffer) { + pipe_transfer_unmap(pipe, cache->trans); } + pipe_resource_reference(&st->bitmap.cache.texture, NULL); } diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index fb98a34..8013226 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -477,20 +477,22 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe, st->shader_has_one_variant[MESA_SHADER_FRAGMENT] = st->has_shareable_shaders && !st->clamp_frag_color_in_shader && !st->force_persample_in_shader; st->shader_has_one_variant[MESA_SHADER_TESS_CTRL] = st->has_shareable_shaders; st->shader_has_one_variant[MESA_SHADER_TESS_EVAL] = st->has_shareable_shaders; st->shader_has_one_variant[MESA_SHADER_GEOMETRY] = st->has_shareable_shaders; st->shader_has_one_variant[MESA_SHADER_COMPUTE] = st->has_shareable_shaders; + st->bitmap.cache.empty = true; + _mesa_compute_version(ctx); if (ctx->Version == 0) { /* This can happen when a core profile was requested, but the driver * does not support some features of GL 3.1 or later. */ st_destroy_context_priv(st, false); return NULL; } diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index dfee927..74ab43c 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -33,39 +33,58 @@ #include "main/fbobject.h" #include "state_tracker/st_atom.h" #include "util/u_inlines.h" #ifdef __cplusplus extern "C" { #endif -struct bitmap_cache; struct dd_function_table; struct draw_context; struct draw_stage; struct gen_mipmap_state; struct st_context; struct st_fragment_program; struct st_perf_monitor_group; struct u_upload_mgr; /** For drawing quads for glClear, glDraw/CopyPixels, glBitmap, etc. */ struct st_util_vertex { float x, y, z; float r, g, b, a; float s, t; }; +struct st_bitmap_cache +{ + /** Window pos to render the cached image */ + GLint xpos, ypos; + /** Bounds of region used in window coords */ + GLint xmin, ymin, xmax, ymax; + + GLfloat color[4]; + + /** Bitmap's Z position */ + GLfloat zpos; + + struct pipe_resource *texture; + struct pipe_transfer *trans; + + GLboolean empty; + + /** An I8 texture image: */ + ubyte *buffer; +}; struct st_context { struct st_context_iface iface; struct gl_context *ctx; struct pipe_context *pipe; struct draw_context *draw; /**< For selection/feedback/rastpos only */ @@ -173,21 +192,21 @@ struct st_context struct pipe_sampler_view *pixelmap_sampler_view; } pixel_xfer; /** for glBitmap */ struct { struct pipe_rasterizer_state rasterizer; struct pipe_sampler_state sampler; struct pipe_sampler_state atlas_sampler; enum pipe_format tex_format; void *vs; - struct bitmap_cache *cache; + struct st_bitmap_cache cache; } bitmap; /** for glDraw/CopyPixels */ struct { void *zs_shaders[4]; void *vert_shaders[2]; /**< ureg shaders */ } drawpix; struct { GLsizei width, height; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev