This patch didn't apply to the 10.1 branch. I've picked most things to the 10.1 branch except this series. Could you put a branch up somewhere and send me a pull request? I'm sure you'd like to have these in the release, and I don't want to mess them up. :)
2e0c90847f16a9cf2a40436beacb65c65535fa4a svga: split / update svga3d header files 024711385ec5333976b124d33a030c30f1345ed1 svga: update dumping code with new GBS commands, etc d993ada50cf2f112bfff2bd7fbb5a6c25ca00306 svga: update svga_winsys interface for GBS 823fbfdca7165ac11eab2a7e168960f5874ebdc3 svga: add new GBS commands 31dfefc47f9f12c49fd3cfb27ba4fe384cb60380 svga: add svga_have_gb_objects/dma() functions 2f1fc8db108eb771414aa5440d4c439f63f4e7c1 svga: update constant buffer code for GBS f84c830b144fd4d53f862fc6ad05541e5bf60a3b svga: update shader code for GBS c1e60a61e8ca3bdac0530ad1aeb3c751f273b73d svga: add helpers for tracking rendering to textures d0c22a6d53a9cce2d40006f3d4d7dd7e2f63aca9 svga: track which textures are rendered to f8bbd8261d297be11f1f2eaf768c2a8ace0cb69d svga: adjust adjustment for point coordinates 6476bcbc5005b76e1494a201f92f3c76bd8e9727 svga: remove a couple unneeded assertions e0a6fb09bdfde40253b924b6c9d1fdf3f16fed21 svga: add new helper functions for GBS buffers 72b0e959fc38cf4f01d8aaeabe7336cc88588f90 svga: update buffer code for GBS 3d1fd6df5315cfa4b9c8b1332f5078a89abc3ed8 svga: update texture code for GBS c9e9b1862b472b2671b8d3b339f9f7624a272073 pipebuffer, winsys: Add a size match parameter to the cached buffer manager 8af358d8bc9f7563cd76313b16d7b149197a4b2c gallium/pipebuffer: Add a cache buffer manager bypass mask 59e7c596215155b556ba8cf06233b621b88f49c6 gallium/util: Add flush/map debug utility code fe6a854477c2ed30c37c200668a4dc86512120f7 svga/winsys: implement GBS support 141e39a8936a7b19fd857a35ea2d200daf1777c7 svga/winsys: Propagate surface shared information to the winsys e4a5a9fd2fdd5b5ae8b85ac743a228f409a21a70 gallium/pipebuffer: change pb_cache_manager_create() size_factor to float On 02/13/2014 05:20 PM, Brian Paul wrote: > Reviewed-by: Thomas Hellstrom <thellst...@vmware.com> > Cc: "10.1" <mesa-sta...@lists.freedesktop.org> > --- > src/gallium/drivers/svga/svga_context.c | 4 +++ > src/gallium/drivers/svga/svga_context.h | 2 ++ > src/gallium/drivers/svga/svga_draw.c | 14 ++++++++ > src/gallium/drivers/svga/svga_shader.c | 21 ++++++++++- > src/gallium/drivers/svga/svga_state.h | 4 +++ > src/gallium/drivers/svga/svga_state_fs.c | 58 > ++++++++++++++++++++++++------ > src/gallium/drivers/svga/svga_state_vs.c | 56 ++++++++++++++++++++++++----- > src/gallium/drivers/svga/svga_tgsi.h | 3 ++ > 8 files changed, 142 insertions(+), 20 deletions(-) > > diff --git a/src/gallium/drivers/svga/svga_context.c > b/src/gallium/drivers/svga/svga_context.c > index de769ca..4da9a65 100644 > --- a/src/gallium/drivers/svga/svga_context.c > +++ b/src/gallium/drivers/svga/svga_context.c > @@ -197,6 +197,10 @@ void svga_context_flush( struct svga_context *svga, > */ > svga->rebind.rendertargets = TRUE; > svga->rebind.texture_samplers = TRUE; > + if (svga_have_gb_objects(svga)) { > + svga->rebind.vs = TRUE; > + svga->rebind.fs = TRUE; > + } > > if (SVGA_DEBUG & DEBUG_SYNC) { > if (fence) > diff --git a/src/gallium/drivers/svga/svga_context.h > b/src/gallium/drivers/svga/svga_context.h > index 71a8eea..0daab0b 100644 > --- a/src/gallium/drivers/svga/svga_context.h > +++ b/src/gallium/drivers/svga/svga_context.h > @@ -374,6 +374,8 @@ struct svga_context > struct { > unsigned rendertargets:1; > unsigned texture_samplers:1; > + unsigned vs:1; > + unsigned fs:1; > } rebind; > > struct svga_hwtnl *hwtnl; > diff --git a/src/gallium/drivers/svga/svga_draw.c > b/src/gallium/drivers/svga/svga_draw.c > index 80dbc35..fa0cac4 100644 > --- a/src/gallium/drivers/svga/svga_draw.c > +++ b/src/gallium/drivers/svga/svga_draw.c > @@ -213,6 +213,20 @@ svga_hwtnl_flush(struct svga_hwtnl *hwtnl) > } > } > > + if (svga->rebind.vs) { > + ret = svga_reemit_vs_bindings(svga); > + if (ret != PIPE_OK) { > + return ret; > + } > + } > + > + if (svga->rebind.fs) { > + ret = svga_reemit_fs_bindings(svga); > + if (ret != PIPE_OK) { > + return ret; > + } > + } > + > SVGA_DBG(DEBUG_DMA, "draw to sid %p, %d prims\n", > svga->curr.framebuffer.cbufs[0] ? > svga_surface(svga->curr.framebuffer.cbufs[0])->handle : NULL, > diff --git a/src/gallium/drivers/svga/svga_shader.c > b/src/gallium/drivers/svga/svga_shader.c > index 88877b2..6b6b441 100644 > --- a/src/gallium/drivers/svga/svga_shader.c > +++ b/src/gallium/drivers/svga/svga_shader.c > @@ -43,7 +43,17 @@ svga_define_shader(struct svga_context *svga, > { > unsigned codeLen = variant->nr_tokens * sizeof(variant->tokens[0]); > > - { > + if (svga_have_gb_objects(svga)) { > + struct svga_winsys_screen *sws = svga_screen(svga->pipe.screen)->sws; > + > + variant->gb_shader = sws->shader_create(sws, type, > + variant->tokens, codeLen); > + if (!variant->gb_shader) > + return PIPE_ERROR_OUT_OF_MEMORY; > + > + return PIPE_OK; > + } > + else { > enum pipe_error ret; > > /* Allocate an integer ID for the shader */ > @@ -79,6 +89,14 @@ svga_destroy_shader_variant(struct svga_context *svga, > { > enum pipe_error ret = PIPE_OK; > > + if (svga_have_gb_objects(svga)) { > + struct svga_winsys_screen *sws = svga_screen(svga->pipe.screen)->sws; > + > + sws->shader_destroy(sws, variant->gb_shader); > + variant->gb_shader = NULL; > + goto end; > + } > + > /* first try */ > if (variant->id != UTIL_BITMASK_INVALID_INDEX) { > ret = SVGA3D_DestroyShader(svga->swc, variant->id, type); > @@ -94,6 +112,7 @@ svga_destroy_shader_variant(struct svga_context *svga, > util_bitmask_clear(svga->shader_id_bm, variant->id); > } > > +end: > FREE((unsigned *)variant->tokens); > FREE(variant); > > diff --git a/src/gallium/drivers/svga/svga_state.h > b/src/gallium/drivers/svga/svga_state.h > index 7051263..3325626 100644 > --- a/src/gallium/drivers/svga/svga_state.h > +++ b/src/gallium/drivers/svga/svga_state.h > @@ -95,4 +95,8 @@ enum pipe_error svga_reemit_framebuffer_bindings( struct > svga_context *svga ); > > enum pipe_error svga_reemit_tss_bindings( struct svga_context *svga ); > > +enum pipe_error svga_reemit_vs_bindings(struct svga_context *svga); > + > +enum pipe_error svga_reemit_fs_bindings(struct svga_context *svga); > + > #endif > diff --git a/src/gallium/drivers/svga/svga_state_fs.c > b/src/gallium/drivers/svga/svga_state_fs.c > index 7119a19..dde739c 100644 > --- a/src/gallium/drivers/svga/svga_state_fs.c > +++ b/src/gallium/drivers/svga/svga_state_fs.c > @@ -321,13 +321,36 @@ make_fs_key(const struct svga_context *svga, > } > > > +/** > + * svga_reemit_fs_bindings - Reemit the fragment shader bindings > + */ > +enum pipe_error > +svga_reemit_fs_bindings(struct svga_context *svga) > +{ > + enum pipe_error ret; > + > + assert(svga->rebind.fs); > + assert(svga_have_gb_objects(svga)); > + > + if (!svga->state.hw_draw.fs) > + return PIPE_OK; > + > + ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS, > + svga->state.hw_draw.fs->gb_shader); > + if (ret != PIPE_OK) > + return ret; > + > + svga->rebind.fs = FALSE; > + return PIPE_OK; > +} > + > + > + > static enum pipe_error > emit_hw_fs(struct svga_context *svga, unsigned dirty) > { > struct svga_shader_variant *variant = NULL; > - unsigned id = SVGA3D_INVALID_ID; > enum pipe_error ret = PIPE_OK; > - > struct svga_fragment_shader *fs = svga->curr.fs; > struct svga_fs_compile_key key; > > @@ -349,17 +372,30 @@ emit_hw_fs(struct svga_context *svga, unsigned dirty) > return ret; > } > > - assert (variant); > - id = variant->id; > - > - assert(id != SVGA3D_INVALID_ID); > + assert(variant); > > if (variant != svga->state.hw_draw.fs) { > - ret = SVGA3D_SetShader(svga->swc, > - SVGA3D_SHADERTYPE_PS, > - id ); > - if (ret != PIPE_OK) > - return ret; > + if (svga_have_gb_objects(svga)) { > + /* > + * Bind is necessary here only because pipebuffer_fenced may move > + * the shader contents around.... > + */ > + ret = SVGA3D_BindGBShader(svga->swc, variant->gb_shader); > + if (ret != PIPE_OK) > + return ret; > + > + ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_PS, > + variant->gb_shader); > + if (ret != PIPE_OK) > + return ret; > + > + svga->rebind.fs = FALSE; > + } > + else { > + ret = SVGA3D_SetShader(svga->swc, SVGA3D_SHADERTYPE_PS, > variant->id); > + if (ret != PIPE_OK) > + return ret; > + } > > svga->dirty |= SVGA_NEW_FS_VARIANT; > svga->state.hw_draw.fs = variant; > diff --git a/src/gallium/drivers/svga/svga_state_vs.c > b/src/gallium/drivers/svga/svga_state_vs.c > index aaef17e..2f130aec 100644 > --- a/src/gallium/drivers/svga/svga_state_vs.c > +++ b/src/gallium/drivers/svga/svga_state_vs.c > @@ -162,12 +162,32 @@ make_vs_key(struct svga_context *svga, struct > svga_vs_compile_key *key) > } > > > +/** > + * svga_reemit_vs_bindings - Reemit the vertex shader bindings > + */ > +enum pipe_error > +svga_reemit_vs_bindings(struct svga_context *svga) > +{ > + enum pipe_error ret; > + struct svga_winsys_gb_shader *gbshader = > + svga->state.hw_draw.vs ? svga->state.hw_draw.vs->gb_shader : NULL; > + > + assert(svga->rebind.vs); > + assert(svga_have_gb_objects(svga)); > + > + ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_VS, gbshader); > + if (ret != PIPE_OK) > + return ret; > + > + svga->rebind.vs = FALSE; > + return PIPE_OK; > +} > + > > static enum pipe_error > emit_hw_vs(struct svga_context *svga, unsigned dirty) > { > struct svga_shader_variant *variant = NULL; > - unsigned id = SVGA3D_INVALID_ID; > enum pipe_error ret = PIPE_OK; > > /* SVGA_NEW_NEED_SWTNL */ > @@ -184,16 +204,36 @@ emit_hw_vs(struct svga_context *svga, unsigned dirty) > return ret; > } > > - assert (variant); > - id = variant->id; > + assert(variant); > } > > if (variant != svga->state.hw_draw.vs) { > - ret = SVGA3D_SetShader(svga->swc, > - SVGA3D_SHADERTYPE_VS, > - id ); > - if (ret != PIPE_OK) > - return ret; > + if (svga_have_gb_objects(svga)) { > + struct svga_winsys_gb_shader *gbshader = > + variant ? variant->gb_shader : NULL; > + > + /* > + * Bind is necessary here only because pipebuffer_fenced may move > + * the shader contents around.... > + */ > + if (gbshader) { > + ret = SVGA3D_BindGBShader(svga->swc, gbshader); > + if (ret != PIPE_OK) > + return ret; > + } > + > + ret = SVGA3D_SetGBShader(svga->swc, SVGA3D_SHADERTYPE_VS, gbshader); > + if (ret != PIPE_OK) > + return ret; > + > + svga->rebind.vs = FALSE; > + } > + else { > + unsigned id = variant ? variant->id : SVGA_ID_INVALID; > + ret = SVGA3D_SetShader(svga->swc, SVGA3D_SHADERTYPE_VS, id); > + if (ret != PIPE_OK) > + return ret; > + } > > svga->dirty |= SVGA_NEW_VS_VARIANT; > svga->state.hw_draw.vs = variant; > diff --git a/src/gallium/drivers/svga/svga_tgsi.h > b/src/gallium/drivers/svga/svga_tgsi.h > index 9a0c7b8..4fe88b3 100644 > --- a/src/gallium/drivers/svga/svga_tgsi.h > +++ b/src/gallium/drivers/svga/svga_tgsi.h > @@ -106,6 +106,9 @@ struct svga_shader_variant > */ > unsigned id; > > + /* GB object buffer containing the bytecode */ > + struct svga_winsys_gb_shader *gb_shader; > + > /** Next variant */ > struct svga_shader_variant *next; > }; > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev