Merge branch 'gallium-vertexelementcso'
authorRoland Scheidegger <sroland@vmware.com>
Tue, 9 Mar 2010 14:59:40 +0000 (15:59 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 9 Mar 2010 14:59:40 +0000 (15:59 +0100)
Conflicts:
src/gallium/auxiliary/cso_cache/cso_context.c
src/gallium/auxiliary/util/u_blit.c
src/gallium/auxiliary/util/u_gen_mipmap.c
src/gallium/drivers/i915/i915_context.h
src/gallium/drivers/i965/brw_draw_upload.c
src/gallium/drivers/r300/r300_blit.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_render.c
src/gallium/drivers/r300/r300_state_derived.c
src/mesa/state_tracker/st_cb_bitmap.c
src/mesa/state_tracker/st_cb_clear.c

33 files changed:
1  2 
progs/gallium/python/retrace/interpreter.py
src/gallium/auxiliary/cso_cache/cso_context.c
src/gallium/auxiliary/cso_cache/cso_context.h
src/gallium/auxiliary/draw/draw_pt.c
src/gallium/auxiliary/util/u_blit.c
src/gallium/auxiliary/util/u_blitter.c
src/gallium/auxiliary/util/u_blitter.h
src/gallium/auxiliary/util/u_dump_state.c
src/gallium/auxiliary/util/u_format.h
src/gallium/auxiliary/util/u_gen_mipmap.c
src/gallium/drivers/i915/i915_context.h
src/gallium/drivers/llvmpipe/lp_context.c
src/gallium/drivers/nv30/nv30_context.h
src/gallium/drivers/nv40/nv40_context.h
src/gallium/drivers/nv40/nv40_state.c
src/gallium/drivers/nv50/nv50_context.h
src/gallium/drivers/r300/r300_blit.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_render.c
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r300/r300_state_derived.c
src/gallium/drivers/svga/svga_pipe_vertex.c
src/gallium/drivers/svga/svga_state_need_swtnl.c
src/gallium/drivers/svga/svga_state_vdecl.c
src/gallium/drivers/trace/tr_dump_state.c
src/gallium/include/pipe/p_state.h
src/mesa/state_tracker/st_cb_bitmap.c
src/mesa/state_tracker/st_cb_clear.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_context.c
src/mesa/state_tracker/st_context.h
src/mesa/state_tracker/st_draw.c

index a7335c340ca8d930235aa30605fcfacef3414293,510366a8d47d42da40ca360ece3e47b0d9e0ad14..292e489312b1572b0d693201c473be7c8a8a2448
@@@ -89,10 -89,8 +89,11 @@@ struct cso_context 
     void *rasterizer, *rasterizer_saved;
     void *fragment_shader, *fragment_shader_saved, *geometry_shader;
     void *vertex_shader, *vertex_shader_saved, *geometry_shader_saved;
+    void *velements, *velements_saved;
  
 +   struct pipe_clip_state clip;
 +   struct pipe_clip_state clip_saved;
 +
     struct pipe_framebuffer_state fb, fb_saved;
     struct pipe_viewport_state vp, vp_saved;
     struct pipe_blend_color blend_color;
@@@ -1130,53 -1145,65 +1148,115 @@@ void cso_restore_geometry_shader(struc
     ctx->geometry_shader_saved = NULL;
  }
  
 +/* clip state */
 +
 +static INLINE void
 +clip_state_cpy(struct pipe_clip_state *dst,
 +               const struct pipe_clip_state *src)
 +{
 +   dst->nr = src->nr;
 +   if (src->nr) {
 +      memcpy(dst->ucp, src->ucp, src->nr * sizeof(src->ucp[0]));
 +   }
 +}
 +
 +static INLINE int
 +clip_state_cmp(const struct pipe_clip_state *a,
 +               const struct pipe_clip_state *b)
 +{
 +   if (a->nr != b->nr) {
 +      return 1;
 +   }
 +   if (a->nr) {
 +      return memcmp(a->ucp, b->ucp, a->nr * sizeof(a->ucp[0]));
 +   }
 +   return 0;
 +}
 +
 +void
 +cso_set_clip(struct cso_context *ctx,
 +             const struct pipe_clip_state *clip)
 +{
 +   if (clip_state_cmp(&ctx->clip, clip)) {
 +      clip_state_cpy(&ctx->clip, clip);
 +      ctx->pipe->set_clip_state(ctx->pipe, clip);
 +   }
 +}
 +
 +void
 +cso_save_clip(struct cso_context *ctx)
 +{
 +   clip_state_cpy(&ctx->clip_saved, &ctx->clip);
 +}
 +
 +void
 +cso_restore_clip(struct cso_context *ctx)
 +{
 +   if (clip_state_cmp(&ctx->clip, &ctx->clip_saved)) {
 +      clip_state_cpy(&ctx->clip, &ctx->clip_saved);
 +      ctx->pipe->set_clip_state(ctx->pipe, &ctx->clip_saved);
 +   }
 +}
++
+ enum pipe_error cso_set_vertex_elements(struct cso_context *ctx,
+                                         unsigned count,
+                                         const struct pipe_vertex_element *states)
+ {
+    unsigned key_size, hash_key;
+    struct cso_hash_iter iter;
+    void *handle;
+    struct cso_velems_state velems_state;
+    /* need to include the count into the stored state data too.
+       Otherwise first few count pipe_vertex_elements could be identical even if count
+       is different, and there's no guarantee the hash would be different in that
+       case neither */
+    key_size = sizeof(struct pipe_vertex_element) * count + sizeof(unsigned);
+    velems_state.count = count;
+    memcpy(velems_state.velems, states, sizeof(struct pipe_vertex_element) * count);
+    hash_key = cso_construct_key((void*)&velems_state, key_size);
+    iter = cso_find_state_template(ctx->cache, hash_key, CSO_VELEMENTS, (void*)&velems_state, key_size);
+    if (cso_hash_iter_is_null(iter)) {
+       struct cso_velements *cso = MALLOC(sizeof(struct cso_velements));
+       if (!cso)
+          return PIPE_ERROR_OUT_OF_MEMORY;
+       memcpy(&cso->state, &velems_state, key_size);
+       cso->data = ctx->pipe->create_vertex_elements_state(ctx->pipe, count, &cso->state.velems[0]);
+       cso->delete_state = (cso_state_callback)ctx->pipe->delete_vertex_elements_state;
+       cso->context = ctx->pipe;
+       iter = cso_insert_state(ctx->cache, hash_key, CSO_VELEMENTS, cso);
+       if (cso_hash_iter_is_null(iter)) {
+          FREE(cso);
+          return PIPE_ERROR_OUT_OF_MEMORY;
+       }
+       handle = cso->data;
+    }
+    else {
+       handle = ((struct cso_velements *)cso_hash_iter_data(iter))->data;
+    }
+    if (ctx->velements != handle) {
+       ctx->velements = handle;
+       ctx->pipe->bind_vertex_elements_state(ctx->pipe, handle);
+    }
+    return PIPE_OK;
+ }
+ void cso_save_vertex_elements(struct cso_context *ctx)
+ {
+    assert(!ctx->velements);
+    ctx->velements_saved = ctx->velements;
+ }
+ void cso_restore_vertex_elements(struct cso_context *ctx)
+ {
+    if (ctx->velements != ctx->velements_saved) {
+       ctx->velements = ctx->velements_saved;
+       ctx->pipe->bind_vertex_elements_state(ctx->pipe, ctx->velements_saved);
+    }
+    ctx->velements_saved = NULL;
 -}
++}
Simple merge
index 0b263a9db5ca31148421b003307eb41220d217bd,0d93e23df865185049c78692e6f51367d13c1b47..4d0737ccd3d03ed0fea6b2ca22b739b4d672c6ab
@@@ -62,7 -62,7 +62,8 @@@ struct blit_stat
     struct pipe_rasterizer_state rasterizer;
     struct pipe_sampler_state sampler;
     struct pipe_viewport_state viewport;
 +   struct pipe_clip_state clip;
+    struct pipe_vertex_element velem[2];
  
     void *vs;
     void *fs[TGSI_WRITEMASK_XYZW + 1];
@@@ -114,6 -115,16 +115,15 @@@ util_create_blit(struct pipe_context *p
     ctx->sampler.mag_img_filter = 0; /* set later */
     ctx->sampler.normalized_coords = 1;
  
 -
+    /* vertex elements state */
+    memset(&ctx->velem[0], 0, sizeof(ctx->velem[0]) * 2);
+    for (i = 0; i < 2; i++) {
+       ctx->velem[i].src_offset = i * 4 * sizeof(float);
+       ctx->velem[i].instance_divisor = 0;
+       ctx->velem[i].vertex_buffer_index = 0;
+       ctx->velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
+    }
     /* vertex shader - still required to provide the linkage between
      * fragment shader input semantics and vertex_element/buffers.
      */
@@@ -409,13 -420,13 +419,15 @@@ util_blit_pixels_writemask(struct blit_
     cso_save_framebuffer(ctx->cso);
     cso_save_fragment_shader(ctx->cso);
     cso_save_vertex_shader(ctx->cso);
 +   cso_save_clip(ctx->cso);
+    cso_save_vertex_elements(ctx->cso);
  
     /* set misc state we care about */
     cso_set_blend(ctx->cso, &ctx->blend);
     cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);
     cso_set_rasterizer(ctx->cso, &ctx->rasterizer);
 +   cso_set_clip(ctx->cso, &ctx->clip);
+    cso_set_vertex_elements(ctx->cso, 2, ctx->velem);
  
     /* sampler */
     ctx->sampler.min_img_filter = filter;
     cso_restore_framebuffer(ctx->cso);
     cso_restore_fragment_shader(ctx->cso);
     cso_restore_vertex_shader(ctx->cso);
 +   cso_restore_clip(ctx->cso);
+    cso_restore_vertex_elements(ctx->cso);
  
     pipe_texture_reference(&tex, NULL);
  }
@@@ -563,13 -560,13 +576,15 @@@ util_blit_pixels_tex(struct blit_state 
     cso_save_framebuffer(ctx->cso);
     cso_save_fragment_shader(ctx->cso);
     cso_save_vertex_shader(ctx->cso);
 +   cso_save_clip(ctx->cso);
+    cso_save_vertex_elements(ctx->cso);
  
     /* set misc state we care about */
     cso_set_blend(ctx->cso, &ctx->blend);
     cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);
     cso_set_rasterizer(ctx->cso, &ctx->rasterizer);
 +   cso_set_clip(ctx->cso, &ctx->clip);
+    cso_set_vertex_elements(ctx->cso, 2, ctx->velem);
  
     /* sampler */
     ctx->sampler.min_img_filter = filter;
     cso_restore_framebuffer(ctx->cso);
     cso_restore_fragment_shader(ctx->cso);
     cso_restore_vertex_shader(ctx->cso);
 +   cso_restore_clip(ctx->cso);
+    cso_restore_vertex_elements(ctx->cso);
  }
Simple merge
index fc027e48e4ebb7e8b1cffdb6686ecd55da38a390,db726df9c3bd2ac9aa57bcf009a53bbdf6339078..d421bee8efe1e26311274996048313fca543d1d2
@@@ -61,7 -61,7 +61,8 @@@ struct gen_mipmap_stat
     struct pipe_depth_stencil_alpha_state depthstencil;
     struct pipe_rasterizer_state rasterizer;
     struct pipe_sampler_state sampler;
 +   struct pipe_clip_state clip;
+    struct pipe_vertex_element velem[2];
  
     void *vs;
     void *fs2d, *fsCube;
@@@ -1499,14 -1509,13 +1509,16 @@@ util_gen_mipmap(struct gen_mipmap_stat
     cso_save_framebuffer(ctx->cso);
     cso_save_fragment_shader(ctx->cso);
     cso_save_vertex_shader(ctx->cso);
 +   cso_save_viewport(ctx->cso);
 +   cso_save_clip(ctx->cso);
+    cso_save_vertex_elements(ctx->cso);
  
     /* bind our state */
     cso_set_blend(ctx->cso, &ctx->blend);
     cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);
     cso_set_rasterizer(ctx->cso, &ctx->rasterizer);
 +   cso_set_clip(ctx->cso, &ctx->clip);
+    cso_set_vertex_elements(ctx->cso, 2, ctx->velem);
  
     cso_set_fragment_shader_handle(ctx->cso, fs);
     cso_set_vertex_shader_handle(ctx->cso, ctx->vs);
     cso_restore_framebuffer(ctx->cso);
     cso_restore_fragment_shader(ctx->cso);
     cso_restore_vertex_shader(ctx->cso);
 +   cso_restore_viewport(ctx->cso);
 +   cso_restore_clip(ctx->cso);
+    cso_restore_vertex_elements(ctx->cso);
  }
index 499a727314d9746d347305c07a8d17257f4d4d25,3e383aaa1ca14cf0c30fbb2dc9f8e2a7dc12c361..49945376837cee71929670930c2f70ef29d0aa30
@@@ -187,9 -187,11 +187,14 @@@ struct i915_sampler_state 
     unsigned maxlod;
  };
  
+ struct i915_velems_state {
+    unsigned count;
+    struct pipe_vertex_element velem[PIPE_MAX_ATTRIBS];
+ };
 +#define I915_MAX_TEXTURE_2D_LEVELS 11  /* max 1024x1024 */
 +#define I915_MAX_TEXTURE_3D_LEVELS  8  /* max 128x128x128 */
 +
  struct i915_texture {
     struct pipe_texture base;
  
Simple merge
index 513cc0f5d44e433d9051ac85232fc65a3f776cb1,297768e5cf46686fd8982010d6dcc4f73a550634..b7ad6b2020608169d2939ef541537aa1945e3585
@@@ -33,9 -33,8 +33,10 @@@ static void r300_blitter_save_states(st
      util_blitter_save_stencil_ref(r300->blitter, &(r300->stencil_ref));
      util_blitter_save_rasterizer(r300->blitter, r300->rs_state.state);
      util_blitter_save_fragment_shader(r300->blitter, r300->fs);
 -    util_blitter_save_vertex_shader(r300->blitter, r300->vs);
 +    util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state);
 +    util_blitter_save_viewport(r300->blitter, &r300->viewport);
 +    util_blitter_save_clip(r300->blitter, &r300->clip);
+     util_blitter_save_vertex_elements(r300->blitter, r300->velems);
  }
  
  /* Clear currently bound buffers. */
index c2825d5f2676923349d0de20758fa71ff8714421,f372743c5b848a2d04a9ebc0ca9158b25b48e102..80e69924f08296cd34e8962b446febd74ec19cc1
@@@ -348,20 -321,11 +363,19 @@@ struct r300_context 
      /* Vertex buffers for Gallium. */
      struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
      int vertex_buffer_count;
 +    int vertex_buffer_max_index;
      /* Vertex elements for Gallium. */
-     struct pipe_vertex_element vertex_element[PIPE_MAX_ATTRIBS];
-     int vertex_element_count;
+     struct r300_velems_state *velems;
  
 +    /* Vertex info for Draw. */
 +    struct vertex_info vertex_info;
 +
      struct pipe_stencil_ref stencil_ref;
  
 +    struct pipe_clip_state clip;
 +
 +    struct pipe_viewport_state viewport;
 +
      /* Bitmask of dirty state objects. */
      uint32_t dirty_state;
      /* Flag indicating whether or not the HW is dirty. */
Simple merge
index c8420bcdd5be0fb28b9e3f565187a777eb2abd09,1850a6f247ac3a3da3b2cc0e6cb1b40327aabbf8..d0e06ade40fb4ec89c5d73ee1090a96114a6a2b9
@@@ -143,8 -128,8 +143,8 @@@ static void r300_emit_draw_arrays_immed
  {
      struct pipe_vertex_element* velem;
      struct pipe_vertex_buffer* vbuf;
-     unsigned vertex_element_count = r300->vertex_element_count;
+     unsigned vertex_element_count = r300->velems->count;
 -    unsigned i, v, vbi, dw, elem_offset;
 +    unsigned i, v, vbi, dw, elem_offset, dwords;
  
      /* Size of the vertex, in dwords. */
      unsigned vertex_size = 0;
Simple merge
index e9e40747ef1f5f9d8f939ca857e0411ac65c08a1,c43a93601cbc87227e2e869403c5c8bf1f2a2ea8..4422581b51482606207707bf96eddfeddb30d843
@@@ -126,11 -127,11 +126,12 @@@ static void r300_vertex_psc(struct r300
       * and not on attrib information. */
      DBG(r300, DBG_DRAW, "r300: vs expects %d attribs, routing %d elements"
              " in psc\n",
 -            r300->vs->info.num_inputs,
 +            vs->info.num_inputs,
+             r300->velems->count);
 +            r300->vertex_element_count);
  
-     for (i = 0; i < r300->vertex_element_count; i++) {
-         format = r300->vertex_element[i].src_format;
+     for (i = 0; i < r300->velems->count; i++) {
+         format = r300->velems->velem[i].src_format;
  
          type = r300_translate_vertex_data_type(format) |
              (stream_tab[i] << R300_DST_VEC_LOC_SHIFT);
index 72635d1031bdfe73c668cfa41806eb367ae64ea1,5670f7a0887d7b935b96125e5c2804b66ed056bd..3a97d888ce63fbc1b441aeb9175d689a3016d86b
@@@ -373,9 -383,8 +373,8 @@@ struct pipe_vertex_elemen
      * this attribute live in?
      */
     unsigned vertex_buffer_index:8;
-    unsigned nr_components:8;
   
 -   enum pipe_format src_format;          /**< PIPE_FORMAT_* */
 +   enum pipe_format src_format;
  };
  
  
index 0332d4dbdfeba5fa88cacb027098605ebcf1303c,95b148a7b454582edebaf32c558ce548d6bf84b4..f326601c3beaa7fd99fb64681b8d5695fef81244
@@@ -490,9 -491,8 +491,11 @@@ draw_bitmap_quad(GLcontext *ctx, GLint 
        cso_set_viewport(cso, &vp);
     }
  
+    cso_set_vertex_elements(cso, 3, st->velems_util_draw);
 +   /* convert Z from [0,1] to [-1,-1] to match viewport Z scale/bias */
 +   z = z * 2.0 - 1.0;
 +
     /* draw textured quad */
     offset = setup_bitmap_vertex_data(st, x, y, width, height, z, color);
  
index 9e66eed36348cae45fc5c96d6dd4b6998b938981,efba9853b4689aeb9e05459df18be0dd00fe71e5..de86062fc404ed601d34d02c0b4eb887368db191
@@@ -209,10 -218,9 +209,11 @@@ clear_with_quad(GLcontext *ctx
     cso_save_stencil_ref(st->cso_context);
     cso_save_depth_stencil_alpha(st->cso_context);
     cso_save_rasterizer(st->cso_context);
 +   cso_save_viewport(st->cso_context);
 +   cso_save_clip(st->cso_context);
     cso_save_fragment_shader(st->cso_context);
     cso_save_vertex_shader(st->cso_context);
+    cso_save_vertex_elements(st->cso_context);
  
     /* blend state: RGBA masking */
     {
        cso_set_depth_stencil_alpha(st->cso_context, &depth_stencil);
     }
  
+    cso_set_vertex_elements(st->cso_context, 2, st->velems_util_draw);
     cso_set_rasterizer(st->cso_context, &st->clear.raster);
  
 +   /* viewport state: viewport matching window dims */
 +   {
 +      const GLboolean invert = (st_fb_orientation(fb) == Y_0_TOP);
 +      struct pipe_viewport_state vp;
 +      vp.scale[0] = 0.5f * fb_width;
 +      vp.scale[1] = fb_height * (invert ? -0.5f : 0.5f);
 +      vp.scale[2] = 1.0f;
 +      vp.scale[3] = 1.0f;
 +      vp.translate[0] = 0.5f * fb_width;
 +      vp.translate[1] = 0.5f * fb_height;
 +      vp.translate[2] = 0.0f;
 +      vp.translate[3] = 0.0f;
 +      cso_set_viewport(st->cso_context, &vp);
 +   }
 +
 +   cso_set_clip(st->cso_context, &st->clear.clip);
     cso_set_fragment_shader_handle(st->cso_context, st->clear.fs);
     cso_set_vertex_shader_handle(st->cso_context, st->clear.vs);
  
     cso_restore_stencil_ref(st->cso_context);
     cso_restore_depth_stencil_alpha(st->cso_context);
     cso_restore_rasterizer(st->cso_context);
 +   cso_restore_viewport(st->cso_context);
 +   cso_restore_clip(st->cso_context);
     cso_restore_fragment_shader(st->cso_context);
     cso_restore_vertex_shader(st->cso_context);
+    cso_restore_vertex_elements(st->cso_context);
  }
  
  
Simple merge
Simple merge
Simple merge