From 46fe17930ec71be3489fbb844de2bf16d877437e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 29 Apr 2012 21:24:39 +0200 Subject: [PATCH] cso: cso_context should install u_vbuf by itself and not st/mesa so that it's installed in the other state trackers too --- src/gallium/auxiliary/cso_cache/cso_context.c | 28 +++++++++++++++---- src/gallium/auxiliary/cso_cache/cso_context.h | 2 -- src/mesa/state_tracker/st_context.c | 27 ------------------ src/mesa/state_tracker/st_context.h | 2 -- 4 files changed, 23 insertions(+), 36 deletions(-) diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index 1cd5f8de184..7f2dc431ae5 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -233,6 +233,25 @@ static INLINE void sanitize_hash(struct cso_hash *hash, enum cso_cache_type type } } +static void cso_init_vbuf(struct cso_context *cso) +{ + struct u_vbuf_caps caps; + + u_vbuf_get_caps(cso->pipe->screen, &caps); + + /* Install u_vbuf if there is anything unsupported. */ + if (!caps.buffer_offset_unaligned || + !caps.buffer_stride_unaligned || + !caps.velem_src_offset_unaligned || + !caps.format_fixed32 || + !caps.format_float16 || + !caps.format_float64 || + !caps.format_norm32 || + !caps.format_scaled32 || + !caps.user_vertex_buffers) { + cso->vbuf = u_vbuf_create(cso->pipe, &caps); + } +} struct cso_context *cso_create_context( struct pipe_context *pipe ) { @@ -251,6 +270,8 @@ struct cso_context *cso_create_context( struct pipe_context *pipe ) ctx->pipe = pipe; + cso_init_vbuf(ctx); + /* Enable for testing: */ if (0) cso_set_maximum_cache_size( ctx->cache, 4 ); @@ -270,11 +291,6 @@ out: return NULL; } -void cso_install_vbuf(struct cso_context *ctx, struct u_vbuf *vbuf) -{ - ctx->vbuf = vbuf; -} - /** * Prior to context destruction, this function unbinds all state objects. */ @@ -343,6 +359,8 @@ void cso_release_all( struct cso_context *ctx ) void cso_destroy_context( struct cso_context *ctx ) { if (ctx) { + if (ctx->vbuf) + u_vbuf_destroy(ctx->vbuf); FREE( ctx ); } } diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h index 79279343c39..4de08a8364c 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.h +++ b/src/gallium/auxiliary/cso_cache/cso_context.h @@ -43,8 +43,6 @@ struct u_vbuf; struct cso_context *cso_create_context( struct pipe_context *pipe ); -void cso_install_vbuf(struct cso_context *ctx, struct u_vbuf *vbuf); - void cso_release_all( struct cso_context *ctx ); void cso_destroy_context( struct cso_context *cso ); diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index d7124087b11..93f4216f34e 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -65,7 +65,6 @@ #include "util/u_inlines.h" #include "util/u_upload_mgr.h" #include "cso_cache/cso_context.h" -#include "util/u_vbuf.h" DEBUG_GET_ONCE_BOOL_OPTION(mesa_mvp_dp4, "MESA_MVP_DP4", FALSE) @@ -112,27 +111,6 @@ st_get_msaa(void) } -static void st_init_vbuf(struct st_context *st) -{ - struct u_vbuf_caps caps; - - u_vbuf_get_caps(st->pipe->screen, &caps); - - /* Create u_vbuf if there is anything unsupported. */ - if (!caps.buffer_offset_unaligned || - !caps.buffer_stride_unaligned || - !caps.velem_src_offset_unaligned || - !caps.format_fixed32 || - !caps.format_float16 || - !caps.format_float64 || - !caps.format_norm32 || - !caps.format_scaled32 || - !caps.user_vertex_buffers) { - /* XXX user vertex buffers are always uploaded regardless of the CAP. */ - st->vbuf = u_vbuf_create(st->pipe, &caps); - cso_install_vbuf(st->cso_context, st->vbuf); - } -} static struct st_context * @@ -173,7 +151,6 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe ) st->cso_context = cso_create_context(pipe); - st_init_vbuf(st); st_init_atoms( st ); st_init_bitmap(st); st_init_clear(st); @@ -286,7 +263,6 @@ static void st_destroy_context_priv( struct st_context *st ) void st_destroy_context( struct st_context *st ) { struct pipe_context *pipe = st->pipe; - struct u_vbuf *vbuf = st->vbuf; struct cso_context *cso = st->cso_context; struct gl_context *ctx = st->ctx; GLuint i; @@ -322,9 +298,6 @@ void st_destroy_context( struct st_context *st ) st_destroy_context_priv(st); st = NULL; - if (vbuf) - u_vbuf_destroy(vbuf); - cso_destroy_context(cso); pipe->destroy( pipe ); diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index 8b8d69e995a..49b8316842e 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -41,7 +41,6 @@ struct gen_mipmap_state; struct st_context; struct st_fragment_program; struct u_upload_mgr; -struct u_vbuf; #define ST_NEW_MESA (1 << 0) /* Mesa state has changed */ @@ -74,7 +73,6 @@ struct st_context struct pipe_context *pipe; struct u_upload_mgr *uploader, *indexbuf_uploader, *constbuf_uploader; - struct u_vbuf *vbuf; struct draw_context *draw; /**< For selection/feedback/rastpos only */ struct draw_stage *feedback_stage; /**< For GL_FEEDBACK rendermode */ -- 2.30.2