Mesa (instanced-arrays): gallium: Move instance_divisor field from vertex_buffer to vertex_element.

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: f7d1689cfa8e3eb2aea4b86031510323b4d13110
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f7d1689cfa8e3eb2aea4b86031510323b4d13110

Author: Michal Krol mic...@vmware.com
Date:   Tue Dec 29 19:18:54 2009 +0100

gallium: Move instance_divisor field from vertex_buffer to vertex_element.

---

 src/gallium/include/pipe/p_state.h |6 +-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/src/gallium/include/pipe/p_state.h 
b/src/gallium/include/pipe/p_state.h
index 4d38bbc..4d25f60 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -364,7 +364,6 @@ struct pipe_vertex_buffer
unsigned stride;/** stride to same attrib in next vertex, in bytes */
unsigned max_index;   /** number of vertices in this buffer */
unsigned buffer_offset;  /** offset to start of data in buffer, in bytes */
-   unsigned instance_divisor;/** instance data rate divisor, 0 means 
per-vertex data */
struct pipe_buffer *buffer;  /** the actual buffer */
 };
 
@@ -377,6 +376,11 @@ struct pipe_vertex_element
/** Offset of this attribute, in bytes, from the start of the vertex */
unsigned src_offset;
 
+   /** Instance data rate divisor. 0 means this is per-vertex data,
+*  n means per-instance data used for n consecutive instances (n  0).
+*/
+   unsigned instance_divisor;
+
/** Which vertex_buffer (as given to pipe-set_vertex_buffer()) does
 * this attribute live in?
 */

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (instanced-arrays): translate: Fix translate_key_compare().

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 7124fa16efe0f8ffb402bcd182f276032bed378d
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=7124fa16efe0f8ffb402bcd182f276032bed378d

Author: Michal Krol mic...@vmware.com
Date:   Tue Dec 29 22:49:31 2009 +0100

translate: Fix translate_key_compare().

Sizes of translate keys must also match.

---

 src/gallium/auxiliary/translate/translate.h |9 +++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/gallium/auxiliary/translate/translate.h 
b/src/gallium/auxiliary/translate/translate.h
index 34526eb..1afdf19 100644
--- a/src/gallium/auxiliary/translate/translate.h
+++ b/src/gallium/auxiliary/translate/translate.h
@@ -103,8 +103,13 @@ static INLINE int translate_keysize( const struct 
translate_key *key )
 static INLINE int translate_key_compare( const struct translate_key *a,
  const struct translate_key *b )
 {
-   int keysize = translate_keysize(a);
-   return memcmp(a, b, keysize);
+   int keysize_a = translate_keysize(a);
+   int keysize_b = translate_keysize(b);
+
+   if (keysize_a != keysize_b) {
+  return keysize_a - keysize_b;
+   }
+   return memcmp(a, b, keysize_a);
 }
 
 

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (instanced-arrays): Implement draw_arrays_instanced() in softpipe.

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 7ca0ce38340144794267609646048b3820d594ab
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=7ca0ce38340144794267609646048b3820d594ab

Author: Michal Krol mic...@vmware.com
Date:   Tue Dec 29 23:21:01 2009 +0100

Implement draw_arrays_instanced() in softpipe.

Modify the translate module to respect instance divisors and accept
instance id as a parameter to calculate input vertex offset.

---

 src/gallium/auxiliary/draw/draw_context.h  |8 +++
 src/gallium/auxiliary/draw/draw_pipe_vbuf.c|3 +-
 src/gallium/auxiliary/draw/draw_private.h  |2 +
 src/gallium/auxiliary/draw/draw_pt.c   |   23 +
 src/gallium/auxiliary/draw/draw_pt_emit.c  |3 +
 src/gallium/auxiliary/draw/draw_pt_fetch.c |3 +
 src/gallium/auxiliary/draw/draw_pt_fetch_emit.c|3 +
 src/gallium/auxiliary/draw/draw_vs.h   |1 +
 src/gallium/auxiliary/draw/draw_vs_varient.c   |6 ++
 src/gallium/auxiliary/tgsi/tgsi_dump.c |3 +-
 src/gallium/auxiliary/translate/translate.h|2 +
 .../auxiliary/translate/translate_generic.c|   16 +-
 src/gallium/auxiliary/translate/translate_sse.c|1 +
 src/gallium/drivers/softpipe/sp_context.c  |1 +
 src/gallium/drivers/softpipe/sp_draw_arrays.c  |   51 
 src/gallium/drivers/softpipe/sp_state.h|8 +++
 src/gallium/drivers/svga/svga_state_vs.c   |1 +
 17 files changed, 130 insertions(+), 5 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_context.h 
b/src/gallium/auxiliary/draw/draw_context.h
index 465b8f1..c0f6a61 100644
--- a/src/gallium/auxiliary/draw/draw_context.h
+++ b/src/gallium/auxiliary/draw/draw_context.h
@@ -151,6 +151,14 @@ void draw_set_mapped_constant_buffer(struct draw_context 
*draw,
 void draw_arrays(struct draw_context *draw, unsigned prim,
 unsigned start, unsigned count);
 
+void
+draw_arrays_instanced(struct draw_context *draw,
+  unsigned mode,
+  unsigned start,
+  unsigned count,
+  unsigned startInstance,
+  unsigned instanceCount);
+
 void draw_flush(struct draw_context *draw);
 
 
diff --git a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c 
b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
index 1a5269c..bb8a8ff 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
@@ -138,7 +138,7 @@ emit_vertex( struct vbuf_stage *vbuf,
   /* Note: we really do want data[0] here, not data[pos]: 
*/
   vbuf-translate-set_buffer(vbuf-translate, 0, vertex-data[0], 0);
-  vbuf-translate-run(vbuf-translate, 0, 1, vbuf-vertex_ptr);
+  vbuf-translate-run(vbuf-translate, 0, 1, 0, vbuf-vertex_ptr);
 
   if (0) draw_dump_emitted_vertex(vbuf-vinfo, (uint8_t 
*)vbuf-vertex_ptr);
   
@@ -275,6 +275,7 @@ vbuf_start_prim( struct vbuf_stage *vbuf, uint prim )
   hw_key.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
   hw_key.element[i].input_buffer = src_buffer;
   hw_key.element[i].input_offset = src_offset;
+  hw_key.element[i].instance_divisor = 0;
   hw_key.element[i].output_format = output_format;
   hw_key.element[i].output_offset = dst_offset;
 
diff --git a/src/gallium/auxiliary/draw/draw_private.h 
b/src/gallium/auxiliary/draw/draw_private.h
index 3850ced..129d919 100644
--- a/src/gallium/auxiliary/draw/draw_private.h
+++ b/src/gallium/auxiliary/draw/draw_private.h
@@ -226,6 +226,8 @@ struct draw_context
 
unsigned reduced_prim;
 
+   unsigned instance_id;
+
void *driver_private;
 };
 
diff --git a/src/gallium/auxiliary/draw/draw_pt.c 
b/src/gallium/auxiliary/draw/draw_pt.c
index 2801dba..1217b9e 100644
--- a/src/gallium/auxiliary/draw/draw_pt.c
+++ b/src/gallium/auxiliary/draw/draw_pt.c
@@ -312,5 +312,28 @@ draw_arrays(struct draw_context *draw, unsigned prim,
 #endif
 
/* drawing done here: */
+   draw-instance_id = 0;
draw_pt_arrays(draw, prim, start, count);
 }
+
+void
+draw_arrays_instanced(struct draw_context *draw,
+  unsigned mode,
+  unsigned start,
+  unsigned count,
+  unsigned startInstance,
+  unsigned instanceCount)
+{
+   unsigned reduced_prim = u_reduced_prim(mode);
+   unsigned instance;
+
+   if (reduced_prim != draw-reduced_prim) {
+  draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE);
+  draw-reduced_prim = reduced_prim;
+   }
+
+   for (instance = 0; instance  instanceCount; instance++) {
+  draw-instance_id = instance + startInstance;
+  draw_pt_arrays(draw, mode, start, count);
+   }
+}
diff --git a/src/gallium/auxiliary/draw/draw_pt_emit.c 
b/src/gallium/auxiliary/draw/draw_pt_emit.c
index 064e16c..d0abeb9 100644
--- a/src/gallium/auxiliary/draw/draw_pt_emit.c
+++ 

Mesa (instanced-arrays): rtasm: Add x86_div().

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 0f185cb027b12356895e424506846fa449e7c47f
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=0f185cb027b12356895e424506846fa449e7c47f

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 14:20:29 2009 +0100

rtasm: Add x86_div().

---

 src/gallium/auxiliary/rtasm/rtasm_x86sse.c |7 +++
 src/gallium/auxiliary/rtasm/rtasm_x86sse.h |1 +
 2 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/rtasm/rtasm_x86sse.c 
b/src/gallium/auxiliary/rtasm/rtasm_x86sse.c
index 1acf3c3..f675427 100644
--- a/src/gallium/auxiliary/rtasm/rtasm_x86sse.c
+++ b/src/gallium/auxiliary/rtasm/rtasm_x86sse.c
@@ -673,6 +673,13 @@ void x86_and( struct x86_function *p,
emit_op_modrm( p, 0x23, 0x21, dst, src );
 }
 
+void x86_div( struct x86_function *p,
+  struct x86_reg src )
+{
+   assert(src.file == file_REG32  src.mod == mod_REG);
+   emit_op_modrm(p, 0xf7, 0, x86_make_reg(file_REG32, 6), src);
+}
+
 
 
 /***
diff --git a/src/gallium/auxiliary/rtasm/rtasm_x86sse.h 
b/src/gallium/auxiliary/rtasm/rtasm_x86sse.h
index 731a651..f7612d4 100644
--- a/src/gallium/auxiliary/rtasm/rtasm_x86sse.h
+++ b/src/gallium/auxiliary/rtasm/rtasm_x86sse.h
@@ -244,6 +244,7 @@ void x86_sub( struct x86_function *p, struct x86_reg dst, 
struct x86_reg src );
 void x86_test( struct x86_function *p, struct x86_reg dst, struct x86_reg src 
);
 void x86_xor( struct x86_function *p, struct x86_reg dst, struct x86_reg src );
 void x86_sahf( struct x86_function *p );
+void x86_div( struct x86_function *p, struct x86_reg src );
 
 
 void x86_cdecl_caller_push_regs( struct x86_function *p );

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (instanced-arrays): translate: Implement instancing for linear SSE run .

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 09c0287b84725098c0b365668231ddf00487c84c
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=09c0287b84725098c0b365668231ddf00487c84c

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 14:23:12 2009 +0100

translate: Implement instancing for linear SSE run.

---

 src/gallium/auxiliary/translate/translate_sse.c |  154 ++-
 1 files changed, 120 insertions(+), 34 deletions(-)

diff --git a/src/gallium/auxiliary/translate/translate_sse.c 
b/src/gallium/auxiliary/translate/translate_sse.c
index edd0be1..ddfa4c6 100644
--- a/src/gallium/auxiliary/translate/translate_sse.c
+++ b/src/gallium/auxiliary/translate/translate_sse.c
@@ -49,6 +49,7 @@
 typedef void (PIPE_CDECL *run_func)( struct translate *translate,
  unsigned start,
  unsigned count,
+ unsigned instance_id,
  void *output_buffer );
 
 typedef void (PIPE_CDECL *run_elts_func)( struct translate *translate,
@@ -59,7 +60,12 @@ typedef void (PIPE_CDECL *run_elts_func)( struct translate 
*translate,
 struct translate_buffer {
const void *base_ptr;
unsigned stride;
-   void *ptr;   /* updated per vertex */
+};
+
+struct translate_buffer_varient {
+   unsigned buffer_index;
+   unsigned instance_divisor;
+   void *ptr;/* updated either per vertex or per instance 
*/
 };
 
 
@@ -81,6 +87,16 @@ struct translate_sse {
struct translate_buffer buffer[PIPE_MAX_ATTRIBS];
unsigned nr_buffers;
 
+   /* Multiple buffer varients can map to a single buffer. */
+   struct translate_buffer_varient buffer_varient[PIPE_MAX_ATTRIBS];
+   unsigned nr_buffer_varients;
+
+   /* Multiple elements can map to a single buffer varient. */
+   unsigned element_to_buffer_varient[PIPE_MAX_ATTRIBS];
+
+   boolean use_instancing;
+   unsigned instance_id;
+
run_func  gen_run;
run_elts_func gen_run_elts;
 
@@ -360,31 +376,59 @@ static boolean init_inputs( struct translate_sse *p,
 {
unsigned i;
if (linear) {
-  for (i = 0; i  p-nr_buffers; i++) {
+  struct x86_reg instance_id = x86_make_disp(p-machine_EDX,
+ get_offset(p, 
p-instance_id));
+
+  for (i = 0; i  p-nr_buffer_varients; i++) {
+ struct translate_buffer_varient *varient = p-buffer_varient[i];
+ struct translate_buffer *buffer = p-buffer[varient-buffer_index];
  struct x86_reg buf_stride   = x86_make_disp(p-machine_EDX,
- get_offset(p, 
p-buffer[i].stride));
+ get_offset(p, 
buffer-stride));
  struct x86_reg buf_ptr  = x86_make_disp(p-machine_EDX,
- get_offset(p, 
p-buffer[i].ptr));
+ get_offset(p, 
varient-ptr));
  struct x86_reg buf_base_ptr = x86_make_disp(p-machine_EDX,
- get_offset(p, 
p-buffer[i].base_ptr));
+ get_offset(p, 
buffer-base_ptr));
  struct x86_reg elt = p-idx_EBX;
- struct x86_reg tmp = p-tmp_EAX;
-
+ struct x86_reg tmp_EAX = p-tmp_EAX;
 
  /* Calculate pointer to first attrib:
+  *   base_ptr + stride * index, where index depends on instance 
divisor
   */
- x86_mov(p-func, tmp, buf_stride);
- x86_imul(p-func, tmp, elt);
- x86_add(p-func, tmp, buf_base_ptr);
+ if (varient-instance_divisor) {
+/* Our index is instance ID divided by instance divisor.
+ */
+x86_mov(p-func, tmp_EAX, instance_id);
+
+if (varient-instance_divisor != 1) {
+   struct x86_reg tmp_EDX = p-machine_EDX;
+   struct x86_reg tmp_ECX = p-outbuf_ECX;
+
+   /* TODO: Add x86_shr() to rtasm and use it whenever
+*   instance divisor is power of two.
+*/
+
+   x86_push(p-func, tmp_EDX);
+   x86_push(p-func, tmp_ECX);
+   x86_xor(p-func, tmp_EDX, tmp_EDX);
+   x86_mov_reg_imm(p-func, tmp_ECX, varient-instance_divisor);
+   x86_div(p-func, tmp_ECX);/* EAX = EDX:EAX / ECX */
+   x86_pop(p-func, tmp_ECX);
+   x86_pop(p-func, tmp_EDX);
+}
+ } else {
+x86_mov(p-func, tmp_EAX, elt);
+ }
+ x86_imul(p-func, tmp_EAX, buf_stride);
+ x86_add(p-func, tmp_EAX, buf_base_ptr);
 
 
  /* In the linear case, keep the buffer pointer instead of the
   * index number.
   */
- if (p-nr_buffers == 1) 
-x86_mov( p-func, elt, tmp );
+ if (p-nr_buffer_varients == 1) 
+

Mesa (master): nouveau: Fix glTexSubImage on swizzled surfaces on =NV40

2009-12-30 Thread Francisco Jerez
Module: Mesa
Branch: master
Commit: 9656177bc0fac5785d01900a768c2855bdc04b5a
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9656177bc0fac5785d01900a768c2855bdc04b5a

Author: Luca Barbieri l...@luca-barbieri.com
Date:   Wed Dec 30 02:54:39 2009 +0100

nouveau: Fix glTexSubImage on swizzled surfaces on =NV40

Currently in nvXX_transfer_new a temporary as large as the surface is created.
If the subrectangle is not the whole texture we would need to read
back the whole texture, but we aren't.
Thus, everything but the subrectangle specified is loaded as garbage.
This can be seen in progs/demos/ray.

This patch fixes the problem by creating a temporary that covers only
the desired subrectangle.

That makes us hit an alignment assert in nv04_surface_2d.c. Fix it
using the point registers instead of manipulating the swizzled surface
offset to account for the destination coordinates (which do not seem
to have a 1024 limit).

Signed-off-by: Francisco Jerez curroje...@riseup.net

---

 src/gallium/drivers/nv04/nv04_surface_2d.c |9 -
 src/gallium/drivers/nv04/nv04_transfer.c   |   24 ++--
 src/gallium/drivers/nv10/nv10_transfer.c   |   24 ++--
 src/gallium/drivers/nv20/nv20_transfer.c   |   24 ++--
 src/gallium/drivers/nv30/nv30_transfer.c   |   24 ++--
 src/gallium/drivers/nv40/nv40_transfer.c   |   24 ++--
 6 files changed, 74 insertions(+), 55 deletions(-)

diff --git a/src/gallium/drivers/nv04/nv04_surface_2d.c 
b/src/gallium/drivers/nv04/nv04_surface_2d.c
index 40b538f..b24a9ce 100644
--- a/src/gallium/drivers/nv04/nv04_surface_2d.c
+++ b/src/gallium/drivers/nv04/nv04_surface_2d.c
@@ -167,20 +167,19 @@ nv04_surface_copy_swizzle(struct nv04_surface_2d *ctx,
  for (x = 0; x  w; x += sub_w) {
sub_w = MIN2(sub_w, w - x);
 
-   /* Must be 64-byte aligned */
-   assert(!((dst-offset + nv04_swizzle_bits(dx+x, dy+y, w, h) * 
util_format_get_blocksize(dst-texture-format))  63));
+   assert(!(dst-offset  63));
 
BEGIN_RING(chan, swzsurf, NV04_SWIZZLED_SURFACE_OFFSET, 1);
-   OUT_RELOCl(chan, dst_bo, dst-offset + nv04_swizzle_bits(dx+x, 
dy+y, w, h) * util_format_get_blocksize(dst-texture-format),
+   OUT_RELOCl(chan, dst_bo, dst-offset,
  NOUVEAU_BO_GART | NOUVEAU_BO_VRAM | 
NOUVEAU_BO_WR);
 
BEGIN_RING(chan, sifm, 
NV04_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION, 9);
OUT_RING  (chan, 
NV04_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION_TRUNCATE);
OUT_RING  (chan, nv04_scaled_image_format(src-format));
OUT_RING  (chan, NV04_SCALED_IMAGE_FROM_MEMORY_OPERATION_SRCCOPY);
-   OUT_RING  (chan, 0);
+   OUT_RING  (chan, (x + dx) | ((y + dy)  
NV04_SCALED_IMAGE_FROM_MEMORY_CLIP_POINT_Y_SHIFT));
OUT_RING  (chan, sub_h  
NV04_SCALED_IMAGE_FROM_MEMORY_CLIP_SIZE_H_SHIFT | sub_w);
-   OUT_RING  (chan, 0);
+   OUT_RING  (chan, (x + dx) | ((y + dy)  
NV04_SCALED_IMAGE_FROM_MEMORY_OUT_POINT_Y_SHIFT));
OUT_RING  (chan, sub_h  
NV04_SCALED_IMAGE_FROM_MEMORY_OUT_SIZE_H_SHIFT | sub_w);
OUT_RING  (chan, 1  20);
OUT_RING  (chan, 1  20);
diff --git a/src/gallium/drivers/nv04/nv04_transfer.c 
b/src/gallium/drivers/nv04/nv04_transfer.c
index 8446073..2dd2e14 100644
--- a/src/gallium/drivers/nv04/nv04_transfer.c
+++ b/src/gallium/drivers/nv04/nv04_transfer.c
@@ -16,14 +16,14 @@ struct nv04_transfer {
 };
 
 static void
-nv04_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
+nv04_compatible_transfer_tex(struct pipe_texture *pt, unsigned width, unsigned 
height,
  struct pipe_texture *template)
 {
memset(template, 0, sizeof(struct pipe_texture));
template-target = pt-target;
template-format = pt-format;
-   template-width0 = u_minify(pt-width0, level);
-   template-height0 = u_minify(pt-height0, level);
+   template-width0 = width;
+   template-height0 = height;
template-depth0 = 1;
template-last_level = 0;
template-nr_samples = pt-nr_samples;
@@ -71,7 +71,7 @@ nv04_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
 
tx-direct = false;
 
-   nv04_compatible_transfer_tex(pt, level, tx_tex_template);
+   nv04_compatible_transfer_tex(pt, w, h, tx_tex_template);
 
tx_tex = pscreen-texture_create(pscreen, tx_tex_template);
if (!tx_tex)
@@ -80,6 +80,8 @@ nv04_transfer_new(struct pipe_screen *pscreen, struct 
pipe_texture *pt,
return NULL;
}
 
+   tx-base.stride = ((struct nv04_miptree*)tx_tex)-level[0].pitch;
+
tx-surface = pscreen-get_tex_surface(pscreen, tx_tex,
   face, level, zslice,
   
pipe_transfer_buffer_flags(tx-base));
@@ -105,8 

Mesa (instanced-arrays): translate: Fix a call to indexed SSE run.

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 76e53923ba79124c6df55bddd7e9a11a7e9104d4
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=76e53923ba79124c6df55bddd7e9a11a7e9104d4

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 16:28:01 2009 +0100

translate: Fix a call to indexed SSE run.

---

 src/gallium/auxiliary/translate/translate_sse.c |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/translate/translate_sse.c 
b/src/gallium/auxiliary/translate/translate_sse.c
index ddfa4c6..ffc5fe9 100644
--- a/src/gallium/auxiliary/translate/translate_sse.c
+++ b/src/gallium/auxiliary/translate/translate_sse.c
@@ -55,6 +55,7 @@ typedef void (PIPE_CDECL *run_func)( struct translate 
*translate,
 typedef void (PIPE_CDECL *run_elts_func)( struct translate *translate,
   const unsigned *elts,
   unsigned count,
+  unsigned instance_id,
   void *output_buffer );
 
 struct translate_buffer {
@@ -693,6 +694,7 @@ static void PIPE_CDECL translate_sse_run_elts( struct 
translate *translate,
p-gen_run_elts( translate,
elts,
count,
+0,
output_buffer );
 }
 

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): mklib: use a wrapper for ar

2009-12-30 Thread Brian Paul
Module: Mesa
Branch: master
Commit: 12039aa7a9e9e7c320e695b2f611b6559925178c
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=12039aa7a9e9e7c320e695b2f611b6559925178c

Author: Brian Paul bri...@vmware.com
Date:   Mon Dec 28 15:12:14 2009 -0700

mklib: use a wrapper for ar

---

 bin/mklib |   98 ++---
 1 files changed, 48 insertions(+), 50 deletions(-)

diff --git a/bin/mklib b/bin/mklib
index fb160a2..0acaeb9 100755
--- a/bin/mklib
+++ b/bin/mklib
@@ -69,6 +69,38 @@ contents_of_archives() {
 }
 
 
+# Make static library with 'ar'
+# params:
+#options to ar
+#1 or 0 to indicate if ranlib should be run
+#libname to make
+#list of object files
+# Return name of library we made
+# Example: make_ar_static_lib -ru 1 libfoo.a foo.o bar.o
+make_ar_static_lib() {
+OPTS=$1
+shift;
+RANLIB=$1
+shift;
+LIBNAME=$1
+shift;
+OBJECTS=$@
+
+# remove existing lib, if present
+rm -f ${LIBNAME}
+
+# make static lib
+ar ${OPTS} ${LIBNAME} ${OBJECTS}
+
+# run ranlib
+if [ ${RANLIB} = 1 ] ; then
+ranlib ${LIBNAME}
+fi
+
+echo ${LIBNAME}
+}
+
+
 # Print usage info.
 usage() {
 echo 'Usage: mklib [options] objects'
@@ -331,15 +363,10 @@ case $ARCH in
NEW_OBJECTS=`expand_archives $OBJECTS`
 
 # make static lib
-rm -f ${LIBNAME}
-ar ${OPTS} ${LIBNAME} ${NEW_OBJECTS}
-ranlib ${LIBNAME}
+   FINAL_LIBS=`make_ar_static_lib ${OPTS} 1 ${LIBNAME} ${NEW_OBJECTS}`
 
# remove temporary extracted .o files
rm -f `contents_of_archives $OBJECTS`
-
-# finish up
-FINAL_LIBS=${LIBNAME}
 else
# make dynamic library
LIBNAME=lib${LIBNAME} # prefix with lib
@@ -402,9 +429,7 @@ case $ARCH in
 if [ $STATIC = 1 ] ; then
LIBNAME=lib${LIBNAME}.a
echo mklib: Making SunOS static library:  ${LIBNAME}
-   rm -f ${LIBNAME}
-   ar -ruv ${LIBNAME} ${OBJECTS}
-   FINAL_LIBS=${LIBNAME}
+   FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
else
if [ $NOPREFIX = 0 ] ; then
LIBNAME=lib${LIBNAME}.so
@@ -530,15 +555,10 @@ case $ARCH in
# expand .a into .o files
NEW_OBJECTS=`expand_archives $OBJECTS`
 
-# make static lib
-   rm -f ${STLIB}
-   ar cq ${STLIB} ${NEW_OBJECTS}
-   ranlib ${STLIB}
+   FINAL_LIBS=`make_ar_static_lib cq 1 ${STLIB} ${NEW_OBJECTS}`
 
# remove temporary extracted .o files
rm -f `contents_of_archives $OBJECTS`
-
-   FINAL_LIBS=${STLIB}
else
# make dynamic library
SHLIB=lib${LIBNAME}.so.${MAJOR}
@@ -558,10 +578,7 @@ case $ARCH in
 if [ $STATIC = 1 ] ; then
LIBNAME=lib${LIBNAME}_pic.a
echo mklib: Making NetBSD PIC static library:  ${LIBNAME}
-   rm -f ${LIBNAME}
-   ar cq ${LIBNAME} ${OBJECTS}
-   ranlib ${LIBNAME}
-   FINAL_LIBS=${LIBNAME}
+   FINAL_LIBS=`make_ar_static_lib cq 1 ${LIBNAME} ${OBJECTS}`
else
LIBNAME=lib${LIBNAME}.so.${MAJOR}.${MINOR}
echo mklib: Making NetBSD PIC shared library:  ${LIBNAME}
@@ -574,9 +591,7 @@ case $ARCH in
 'IRIX' | 'IRIX64')
 if [ $STATIC = 1 ] ; then
LIBNAME=lib${LIBNAME}.a
-   rm -f ${LIBNAME}
-   ar rc ${LIBNAME} ${OBJECTS}
-   FINAL_LIBS=${LIBNAME}
+   FINAL_LIBS=`make_ar_static_lib rc 0 ${LIBNAME} ${OBJECTS}`
else
LIBNAME=lib${LIBNAME}.so  # prefix with lib, suffix with .so
 
@@ -627,9 +642,7 @@ case $ARCH in
 if [ $STATIC = 1 ] ; then
LIBNAME=lib${LIBNAME}.a
echo mklib: Making HP-UX static library:  ${LIBNAME}
-   rm -f ${LIBNAME}
-   ar -ruv ${LIBNAME} ${OBJECTS}
-   FINAL_LIBS=${LIBNAME}
+   FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
else
 # HP uses a .2 for their current GL/GLU libraries
if [ ${LIBNAME} = GL -o ${LIBNAME} = GLU ] ; then
@@ -659,8 +672,7 @@ case $ARCH in
if [ $STATIC = 1 ] ; then
LIBNAME=lib${LIBNAME}.a
echo mklib: Making AIX static library:  ${LIBNAME}
-   ar -ruv ${X64} ${LIBNAME} ${OBJECTS}
-   FINAL_LIBS=${LIBNAME}
+   FINAL_LIBS=`make_ar_static_lib -ruv 0 ${LIBNAME} ${OBJECTS}`
else
EXPFILE=lib${LIBNAME}.exp
LIBNAME=lib${LIBNAME}.a  # shared objects are still stored in the 
.a libraries
@@ -711,9 +723,7 @@ case $ARCH in
 if [ $STATIC = 1 ] ; then
LIBNAME=lib${LIBNAME}.a
echo mklib: Making OSF/1 static library:  ${LIBNAME}
-   rm -f ${LIBNAME}
-   ar -ruv ${LIBNAME} ${OBJECTS}
-   FINAL_LIBS=${LIBNAME}
+   

Mesa (master): mesa: implement GL3 glClearBuffer() functions

2009-12-30 Thread Brian Paul
Module: Mesa
Branch: master
Commit: 2b5ece5746585fd1b6ffd4768763dfc5709699ab
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=2b5ece5746585fd1b6ffd4768763dfc5709699ab

Author: Brian Paul bri...@vmware.com
Date:   Wed Dec 30 09:25:24 2009 -0700

mesa: implement GL3 glClearBuffer() functions

These functions clear color/depth/stencil buffers with a value that's
passed to the function, rather than the context clear values.

For now these functions are implemented in terms of the existing
ctx-Driver.Clear() hook.  In the future when we have non-normalized
integer and unsigned integer color buffer formats we'll need new
driver hook(s) to pass int and uint clear values to the driver.

Note: these functions are not hooked into the dispatch table at this time.

---

 src/mesa/main/clear.c |  344 +
 src/mesa/main/clear.h |   13 ++
 2 files changed, 357 insertions(+), 0 deletions(-)

diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c
index 63388f4..4a3c111 100644
--- a/src/mesa/main/clear.c
+++ b/src/mesa/main/clear.c
@@ -34,6 +34,7 @@
 #include clear.h
 #include context.h
 #include colormac.h
+#include enums.h
 #include state.h
 
 
@@ -182,3 +183,346 @@ _mesa_Clear( GLbitfield mask )
   ctx-Driver.Clear(ctx, bufferMask);
}
 }
+
+
+/** Returned by make_color_buffer_mask() for errors */
+#define INVALID_MASK ~0x0
+
+
+/**
+ * Convert the glClearBuffer 'drawbuffer' parameter into a bitmask of
+ * BUFFER_BIT_x values.
+ * Return INVALID_MASK if the drawbuffer value is invalid.
+ */
+static GLbitfield
+make_color_buffer_mask(GLcontext *ctx, GLint drawbuffer)
+{
+   const struct gl_renderbuffer_attachment *att = ctx-DrawBuffer-Attachment;
+   GLbitfield mask = 0x0;
+
+   switch (drawbuffer) {
+   case GL_FRONT:
+  if (att[BUFFER_FRONT_LEFT].Renderbuffer)
+ mask |= BUFFER_BIT_FRONT_LEFT;
+  if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
+ mask |= BUFFER_BIT_FRONT_RIGHT;
+  break;
+   case GL_BACK:
+  if (att[BUFFER_BACK_LEFT].Renderbuffer)
+ mask |= BUFFER_BIT_BACK_LEFT;
+  if (att[BUFFER_BACK_RIGHT].Renderbuffer)
+ mask |= BUFFER_BIT_BACK_RIGHT;
+  break;
+   case GL_LEFT:
+  if (att[BUFFER_FRONT_LEFT].Renderbuffer)
+ mask |= BUFFER_BIT_FRONT_LEFT;
+  if (att[BUFFER_BACK_LEFT].Renderbuffer)
+ mask |= BUFFER_BIT_BACK_LEFT;
+  break;
+   case GL_RIGHT:
+  if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
+ mask |= BUFFER_BIT_FRONT_RIGHT;
+  if (att[BUFFER_BACK_RIGHT].Renderbuffer)
+ mask |= BUFFER_BIT_BACK_RIGHT;
+  break;
+   case GL_FRONT_AND_BACK:
+  if (att[BUFFER_FRONT_LEFT].Renderbuffer)
+ mask |= BUFFER_BIT_FRONT_LEFT;
+  if (att[BUFFER_BACK_LEFT].Renderbuffer)
+ mask |= BUFFER_BIT_BACK_LEFT;
+  if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
+ mask |= BUFFER_BIT_FRONT_RIGHT;
+  if (att[BUFFER_BACK_RIGHT].Renderbuffer)
+ mask |= BUFFER_BIT_BACK_RIGHT;
+  break;
+   default:
+  if (drawbuffer  0 || drawbuffer = ctx-Const.MaxDrawBuffers) {
+ mask = INVALID_MASK;
+  }
+  else if (att[BUFFER_COLOR0 + drawbuffer].Renderbuffer) {
+ mask |= (BUFFER_BIT_COLOR0  drawbuffer);
+  }
+   }
+
+   return mask;
+}
+
+
+
+/**
+ * New in GL 3.0
+ * Clear signed integer color buffer or stencil buffer (not depth).
+ */
+void GLAPIENTRY
+_mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   FLUSH_CURRENT(ctx, 0);
+
+   if (!ctx-DrawBuffer-Visual.rgbMode) {
+  _mesa_error(ctx, GL_INVALID_OPERATION, glClearBufferiv());
+  return;
+   }
+
+   if (ctx-NewState) {
+  _mesa_update_state( ctx );
+   }
+
+   switch (buffer) {
+   case GL_STENCIL:
+  if (drawbuffer != 0) {
+ _mesa_error(ctx, GL_INVALID_VALUE, glClearBufferiv(drawbuffer=%d),
+ drawbuffer);
+ return;
+  }
+  else {
+ /* Save current stencil clear value, set to 'value', do the
+  * stencil clear and restore the clear value.
+  * XXX in the future we may have a new ctx-Driver.ClearBuffer()
+  * hook instead.
+  */
+ const GLuint clearSave = ctx-Stencil.Clear;
+ ctx-Stencil.Clear = *value;
+ if (ctx-Driver.ClearStencil)
+ctx-Driver.ClearStencil(ctx, *value);
+ ctx-Driver.Clear(ctx, BUFFER_BIT_STENCIL);
+ ctx-Stencil.Clear = clearSave;
+ if (ctx-Driver.ClearStencil)
+ctx-Driver.ClearStencil(ctx, clearSave);
+  }
+  break;
+   case GL_COLOR:
+  {
+ const GLbitfield mask = make_color_buffer_mask(ctx, drawbuffer);
+ if (mask == INVALID_MASK) {
+_mesa_error(ctx, GL_INVALID_VALUE, 
glClearBufferiv(drawbuffer=%d),
+drawbuffer);
+return;
+ }
+ else if (mask) {
+/* XXX note: 

Mesa (master): mesa: display list support for glClearBuffer functions

2009-12-30 Thread Brian Paul
Module: Mesa
Branch: master
Commit: 05fb922e61efc2712bf7499f31e4b36b06a54f56
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=05fb922e61efc2712bf7499f31e4b36b06a54f56

Author: Brian Paul bri...@vmware.com
Date:   Wed Dec 30 09:45:58 2009 -0700

mesa: display list support for glClearBuffer functions

Note: some code disabled until dispatch table supports GL3 entrypoints.

---

 src/mesa/main/dlist.c |  154 +
 1 files changed, 154 insertions(+), 0 deletions(-)

diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c
index 9347b97..1f19716 100644
--- a/src/mesa/main/dlist.c
+++ b/src/mesa/main/dlist.c
@@ -218,6 +218,10 @@ typedef enum
OPCODE_CLEAR_DEPTH,
OPCODE_CLEAR_INDEX,
OPCODE_CLEAR_STENCIL,
+   OPCODE_CLEAR_BUFFER_IV,
+   OPCODE_CLEAR_BUFFER_UIV,
+   OPCODE_CLEAR_BUFFER_FV,
+   OPCODE_CLEAR_BUFFER_FI,
OPCODE_CLIP_PLANE,
OPCODE_COLOR_MASK,
OPCODE_COLOR_MASK_INDEXED,
@@ -1234,6 +1238,110 @@ save_Clear(GLbitfield mask)
 
 
 static void GLAPIENTRY
+save_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_IV, 6);
+   if (n) {
+  n[1].e = buffer;
+  n[2].i = drawbuffer;
+  n[3].i = value[0];
+  if (buffer == GL_COLOR) {
+ n[4].i = value[1];
+ n[5].i = value[2];
+ n[6].i = value[3];
+  }
+  else {
+ n[4].i = 0;
+ n[5].i = 0;
+ n[6].i = 0;
+  }
+   }
+   if (ctx-ExecuteFlag) {
+  /*CALL_ClearBufferiv(ctx-Exec, (buffer, drawbuffer, value));*/
+   }
+}
+
+
+static void GLAPIENTRY
+save_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_UIV, 6);
+   if (n) {
+  n[1].e = buffer;
+  n[2].i = drawbuffer;
+  n[3].ui = value[0];
+  if (buffer == GL_COLOR) {
+ n[4].ui = value[1];
+ n[5].ui = value[2];
+ n[6].ui = value[3];
+  }
+  else {
+ n[4].ui = 0;
+ n[5].ui = 0;
+ n[6].ui = 0;
+  }
+   }
+   if (ctx-ExecuteFlag) {
+  /*CALL_ClearBufferuiv(ctx-Exec, (buffer, drawbuffer, value));*/
+   }
+}
+
+
+static void GLAPIENTRY
+save_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FV, 6);
+   if (n) {
+  n[1].e = buffer;
+  n[2].i = drawbuffer;
+  n[3].f = value[0];
+  if (buffer == GL_COLOR) {
+ n[4].f = value[1];
+ n[5].f = value[2];
+ n[6].f = value[3];
+  }
+  else {
+ n[4].f = 0.0F;
+ n[5].f = 0.0F;
+ n[6].f = 0.0F;
+  }
+   }
+   if (ctx-ExecuteFlag) {
+  /*CALL_ClearBufferuiv(ctx-Exec, (buffer, drawbuffer, value));*/
+   }
+}
+
+
+static void GLAPIENTRY
+save_ClearBufferfi(GLenum buffer, GLint drawbuffer,
+   GLfloat depth, GLint stencil)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FI, 4);
+   if (n) {
+  n[1].e = buffer;
+  n[2].i = drawbuffer;
+  n[3].f = depth;
+  n[4].i = stencil;
+   }
+   if (ctx-ExecuteFlag) {
+  /*CALL_ClearBufferfi(ctx-Exec, (buffer, drawbuffer, depth, stencil));*/
+   }
+}
+
+
+static void GLAPIENTRY
 save_ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
 {
GET_CURRENT_CONTEXT(ctx);
@@ -6655,6 +6763,39 @@ execute_list(GLcontext *ctx, GLuint list)
  case OPCODE_CLEAR:
 CALL_Clear(ctx-Exec, (n[1].bf));
 break;
+ case OPCODE_CLEAR_BUFFER_IV:
+{
+   GLint value[4];
+   value[0] = n[3].i;
+   value[1] = n[4].i;
+   value[2] = n[5].i;
+   value[3] = n[6].i;
+   /*CALL_ClearBufferiv(ctx-Exec, (n[1].e, n[2].i, value));*/
+}
+break;
+ case OPCODE_CLEAR_BUFFER_UIV:
+{
+   GLuint value[4];
+   value[0] = n[3].ui;
+   value[1] = n[4].ui;
+   value[2] = n[5].ui;
+   value[3] = n[6].ui;
+   /*CALL_ClearBufferiv(ctx-Exec, (n[1].e, n[2].i, value));*/
+}
+break;
+ case OPCODE_CLEAR_BUFFER_FV:
+{
+   GLfloat value[4];
+   value[0] = n[3].f;
+   value[1] = n[4].f;
+   value[2] = n[5].f;
+   value[3] = n[6].f;
+   /*CALL_ClearBufferfv(ctx-Exec, (n[1].e, n[2].i, value));*/
+}
+break;
+ case OPCODE_CLEAR_BUFFER_FI:
+/*CALL_ClearBufferfi(ctx-Exec, (n[1].e, 

Mesa (master): mesa: simplify some extension testing code

2009-12-30 Thread Brian Paul
Module: Mesa
Branch: master
Commit: 1ec6de9f948b45e24ecd0e039819e90863ec9646
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ec6de9f948b45e24ecd0e039819e90863ec9646

Author: Brian Paul bri...@vmware.com
Date:   Wed Dec 30 10:13:31 2009 -0700

mesa: simplify some extension testing code

---

 src/mesa/main/extensions.c |   29 -
 1 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
index 9e96eb0..a1561b4 100644
--- a/src/mesa/main/extensions.c
+++ b/src/mesa/main/extensions.c
@@ -524,19 +524,33 @@ _mesa_disable_extension( GLcontext *ctx, const char *name 
)
 
 
 /**
+ * Check if the i-th extension is enabled.
+ */
+static GLboolean
+extension_enabled(GLcontext *ctx, GLuint index)
+{
+   const GLboolean *base = (const GLboolean *) ctx-Extensions;
+   if (!default_extensions[index].flag_offset ||
+   *(base + default_extensions[index].flag_offset)) {
+  return GL_TRUE;
+   }
+   else {
+  return GL_FALSE;
+   }
+}
+
+
+/**
  * Test if the named extension is enabled in this context.
  */
 GLboolean
 _mesa_extension_is_enabled( GLcontext *ctx, const char *name )
 {
-   const GLboolean *base = (const GLboolean *) ctx-Extensions;
GLuint i;
 
for (i = 0 ; i  Elements(default_extensions) ; i++) {
   if (_mesa_strcmp(default_extensions[i].name, name) == 0) {
- if (!default_extensions[i].flag_offset)
-return GL_TRUE;
- return *(base + default_extensions[i].flag_offset);
+ return extension_enabled(ctx, i);
   }
}
return GL_FALSE;
@@ -644,7 +658,6 @@ _mesa_init_extensions( GLcontext *ctx )
 GLubyte *
 _mesa_make_extension_string( GLcontext *ctx )
 {
-   const GLboolean *base = (const GLboolean *) ctx-Extensions;
const char *extraExt = get_extension_override(ctx);
GLuint extStrLen = 0;
char *s;
@@ -652,8 +665,7 @@ _mesa_make_extension_string( GLcontext *ctx )
 
/* first, compute length of the extension string */
for (i = 0 ; i  Elements(default_extensions) ; i++) {
-  if (!default_extensions[i].flag_offset ||
-  *(base + default_extensions[i].flag_offset)) {
+  if (extension_enabled(ctx, i)) {
  extStrLen += (GLuint)_mesa_strlen(default_extensions[i].name) + 1;
   }
}
@@ -669,8 +681,7 @@ _mesa_make_extension_string( GLcontext *ctx )
/* second, build the extension string */
extStrLen = 0;
for (i = 0 ; i  Elements(default_extensions) ; i++) {
-  if (!default_extensions[i].flag_offset ||
-  *(base + default_extensions[i].flag_offset)) {
+  if (extension_enabled(ctx, i)) {
  GLuint len = (GLuint)_mesa_strlen(default_extensions[i].name);
  _mesa_memcpy(s + extStrLen, default_extensions[i].name, len);
  extStrLen += len;

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): mesa: implement GL3 GL_NUM_EXTENSIONS query

2009-12-30 Thread Brian Paul
Module: Mesa
Branch: master
Commit: 802b80893943cf129039a37fb2afe26444b09332
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=802b80893943cf129039a37fb2afe26444b09332

Author: Brian Paul bri...@vmware.com
Date:   Wed Dec 30 10:16:01 2009 -0700

mesa: implement GL3 GL_NUM_EXTENSIONS query

---

 src/mesa/main/extensions.c |   25 +
 src/mesa/main/extensions.h |4 
 src/mesa/main/get.c|   12 
 src/mesa/main/get_gen.py   |3 +++
 src/mesa/main/mtypes.h |2 ++
 5 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
index a1561b4..88c025e 100644
--- a/src/mesa/main/extensions.c
+++ b/src/mesa/main/extensions.c
@@ -700,3 +700,28 @@ _mesa_make_extension_string( GLcontext *ctx )
 
return (GLubyte *) s;
 }
+
+
+/**
+ * Return number of enabled extensions.
+ */
+GLuint
+_mesa_get_extension_count(GLcontext *ctx)
+{
+   GLuint i;
+
+   /* only count once */
+   if (!ctx-Extensions.Count) {
+  for (i = 0; i  Elements(default_extensions); i++) {
+ if (extension_enabled(ctx, i)) {
+ctx-Extensions.Count++;
+ }
+  }
+   }
+
+   if (0)
+  _mesa_debug(ctx, %u of %d extensions enabled\n, ctx-Extensions.Count,
+  Elements(default_extensions));
+
+   return ctx-Extensions.Count;
+}
diff --git a/src/mesa/main/extensions.h b/src/mesa/main/extensions.h
index 05ad859..194c2ef 100644
--- a/src/mesa/main/extensions.h
+++ b/src/mesa/main/extensions.h
@@ -64,6 +64,10 @@ extern void _mesa_init_extensions(GLcontext *ctx);
 
 extern GLubyte *_mesa_make_extension_string(GLcontext *ctx);
 
+extern GLuint
+_mesa_get_extension_count(GLcontext *ctx);
+
+
 #else
 
 /** No-op */
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 99478f0..618b541 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -1899,6 +1899,9 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
  CHECK_EXT1(ARB_sync, GetBooleanv);
  params[0] = INT64_TO_BOOLEAN(ctx-Const.MaxServerWaitTimeout);
  break;
+  case GL_NUM_EXTENSIONS:
+ params[0] = INT_TO_BOOLEAN(_mesa_get_extension_count(ctx));
+ break;
   default:
  _mesa_error(ctx, GL_INVALID_ENUM, glGetBooleanv(pname=0x%x), pname);
}
@@ -3734,6 +3737,9 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
  CHECK_EXT1(ARB_sync, GetFloatv);
  params[0] = (GLfloat)(ctx-Const.MaxServerWaitTimeout);
  break;
+  case GL_NUM_EXTENSIONS:
+ params[0] = (GLfloat)(_mesa_get_extension_count(ctx));
+ break;
   default:
  _mesa_error(ctx, GL_INVALID_ENUM, glGetFloatv(pname=0x%x), pname);
}
@@ -5569,6 +5575,9 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
  CHECK_EXT1(ARB_sync, GetIntegerv);
  params[0] = INT64_TO_INT(ctx-Const.MaxServerWaitTimeout);
  break;
+  case GL_NUM_EXTENSIONS:
+ params[0] = _mesa_get_extension_count(ctx);
+ break;
   default:
  _mesa_error(ctx, GL_INVALID_ENUM, glGetIntegerv(pname=0x%x), pname);
}
@@ -7405,6 +7414,9 @@ _mesa_GetInteger64v( GLenum pname, GLint64 *params )
  CHECK_EXT1(ARB_sync, GetInteger64v);
  params[0] = ctx-Const.MaxServerWaitTimeout;
  break;
+  case GL_NUM_EXTENSIONS:
+ params[0] = (GLint64)(_mesa_get_extension_count(ctx));
+ break;
   default:
  _mesa_error(ctx, GL_INVALID_ENUM, glGetInteger64v(pname=0x%x), 
pname);
}
diff --git a/src/mesa/main/get_gen.py b/src/mesa/main/get_gen.py
index 82eacf0..7540661 100644
--- a/src/mesa/main/get_gen.py
+++ b/src/mesa/main/get_gen.py
@@ -1030,6 +1030,9 @@ StateVars = [
# GL_ARB_sync
( GL_MAX_SERVER_WAIT_TIMEOUT, GLint64, 
[ctx-Const.MaxServerWaitTimeout], ,
  [ARB_sync] ),
+
+   # GL3
+   ( GL_NUM_EXTENSIONS, GLint, [_mesa_get_extension_count(ctx)], , 
None ),
 ]
 
 
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 3a48c8b..849d168 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2512,6 +2512,8 @@ struct gl_extensions
GLboolean S3_s3tc;
/** The extension string */
const GLubyte *String;
+   /** Number of supported extensions */
+   GLuint Count;
 };
 
 

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): mesa: _mesa_get_enabled_extension() function

2009-12-30 Thread Brian Paul
Module: Mesa
Branch: master
Commit: 56bdaca03e2289f56d1c88668d0a0f1dbd5abeca
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=56bdaca03e2289f56d1c88668d0a0f1dbd5abeca

Author: Brian Paul bri...@vmware.com
Date:   Wed Dec 30 10:29:53 2009 -0700

mesa: _mesa_get_enabled_extension() function

---

 src/mesa/main/extensions.c |   20 
 src/mesa/main/extensions.h |3 +++
 2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
index 88c025e..7aec95f 100644
--- a/src/mesa/main/extensions.c
+++ b/src/mesa/main/extensions.c
@@ -725,3 +725,23 @@ _mesa_get_extension_count(GLcontext *ctx)
 
return ctx-Extensions.Count;
 }
+
+
+/**
+ * Return name of i-th enabled extension
+ */
+const GLubyte *
+_mesa_get_enabled_extension(GLcontext *ctx, GLuint index)
+{
+   GLuint i;
+
+   for (i = 0; i  Elements(default_extensions); i++) {
+  if (extension_enabled(ctx, i)) {
+ if (index == 0)
+return (const GLubyte *) default_extensions[i].name;
+ index--;
+  }
+   }
+
+   return NULL;
+}
diff --git a/src/mesa/main/extensions.h b/src/mesa/main/extensions.h
index 194c2ef..a254724 100644
--- a/src/mesa/main/extensions.h
+++ b/src/mesa/main/extensions.h
@@ -67,6 +67,9 @@ extern GLubyte *_mesa_make_extension_string(GLcontext *ctx);
 extern GLuint
 _mesa_get_extension_count(GLcontext *ctx);
 
+extern const GLubyte *
+_mesa_get_enabled_extension(GLcontext *ctx, GLuint index);
+
 
 #else
 

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): mesa: implement _mesa_GetStringi() for GL3

2009-12-30 Thread Brian Paul
Module: Mesa
Branch: master
Commit: 16e91d4c0e1088f5c4098b01b4b7bf670cd66c4a
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=16e91d4c0e1088f5c4098b01b4b7bf670cd66c4a

Author: Brian Paul bri...@vmware.com
Date:   Wed Dec 30 10:30:16 2009 -0700

mesa: implement _mesa_GetStringi() for GL3

Note: not plugged into the dispatch table yet.

---

 src/mesa/main/get.h   |3 +++
 src/mesa/main/getstring.c |   28 
 2 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/src/mesa/main/get.h b/src/mesa/main/get.h
index 076ab7a..cc426fc 100644
--- a/src/mesa/main/get.h
+++ b/src/mesa/main/get.h
@@ -65,6 +65,9 @@ _mesa_GetPointerv( GLenum pname, GLvoid **params );
 extern const GLubyte * GLAPIENTRY
 _mesa_GetString( GLenum name );
 
+extern const GLubyte * GLAPIENTRY
+_mesa_GetStringi(GLenum name, GLuint index);
+
 extern GLenum GLAPIENTRY
 _mesa_GetError( void );
 
diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c
index 6599ed9..cac5eef 100644
--- a/src/mesa/main/getstring.c
+++ b/src/mesa/main/getstring.c
@@ -184,6 +184,34 @@ _mesa_GetString( GLenum name )
 
 
 /**
+ * GL3
+ */
+const GLubyte * GLAPIENTRY
+_mesa_GetStringi(GLenum name, GLuint index)
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (!ctx)
+  return NULL;
+
+   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
+
+   switch (name) {
+   case GL_EXTENSIONS:
+  if (index = _mesa_get_extension_count(ctx)) {
+ _mesa_error(ctx, GL_INVALID_VALUE, glGetStringi(index=%u), index);
+ return (const GLubyte *) 0;
+  }
+  return _mesa_get_enabled_extension(ctx, index);
+   default:
+  _mesa_error( ctx, GL_INVALID_ENUM, glGetString );
+  return (const GLubyte *) 0;
+   }
+}
+
+
+
+/**
  * Return pointer-valued state, such as a vertex array pointer.
  *
  * \param pname  names state to be queried

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (instanced-arrays): sp: Generalise drawing code to remove dupes.

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 230355648b647b32161124cad23be553a2c6d196
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=230355648b647b32161124cad23be553a2c6d196

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 18:41:05 2009 +0100

sp: Generalise drawing code to remove dupes.

Also, avoid nested draw calls from simpler versions.

---

 src/gallium/drivers/softpipe/sp_draw_arrays.c |  165 +
 1 files changed, 84 insertions(+), 81 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c 
b/src/gallium/drivers/softpipe/sp_draw_arrays.c
index debf5bf..14cb132 100644
--- a/src/gallium/drivers/softpipe/sp_draw_arrays.c
+++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c
@@ -88,19 +88,41 @@ softpipe_unmap_constant_buffers(struct softpipe_context *sp)
 }
 
 
+/**
+ * Draw vertex arrays, with optional indexing.
+ * Basically, map the vertex buffers (and drawing surfaces), then hand off
+ * the drawing to the 'draw' module.
+ */
+static boolean
+softpipe_draw_range_elements_instanced(struct pipe_context *pipe,
+   struct pipe_buffer *indexBuffer,
+   unsigned indexSize,
+   unsigned minIndex,
+   unsigned maxIndex,
+   unsigned mode,
+   unsigned start,
+   unsigned count,
+   unsigned startInstance,
+   unsigned instanceCount);
+
+
 boolean
 softpipe_draw_arrays(struct pipe_context *pipe, unsigned mode,
  unsigned start, unsigned count)
 {
-   return softpipe_draw_elements(pipe, NULL, 0, mode, start, count);
+   return softpipe_draw_range_elements_instanced(pipe,
+ NULL,
+ 0,
+ 0,
+ 0x,
+ mode,
+ start,
+ count,
+ 0,
+ 1);
 }
 
 
-/**
- * Draw vertex arrays, with optional indexing.
- * Basically, map the vertex buffers (and drawing surfaces), then hand off
- * the drawing to the 'draw' module.
- */
 boolean
 softpipe_draw_range_elements(struct pipe_context *pipe,
  struct pipe_buffer *indexBuffer,
@@ -109,67 +131,16 @@ softpipe_draw_range_elements(struct pipe_context *pipe,
  unsigned max_index,
  unsigned mode, unsigned start, unsigned count)
 {
-   struct softpipe_context *sp = softpipe_context(pipe);
-   struct draw_context *draw = sp-draw;
-   unsigned i;
-
-   sp-reduced_api_prim = u_reduced_prim(mode);
-
-   if (sp-dirty)
-  softpipe_update_derived( sp );
-
-   softpipe_map_transfers(sp);
-   softpipe_map_constant_buffers(sp);
-
-   /*
-* Map vertex buffers
-*/
-   for (i = 0; i  sp-num_vertex_buffers; i++) {
-  void *buf
- = pipe_buffer_map(pipe-screen,
-sp-vertex_buffer[i].buffer,
-PIPE_BUFFER_USAGE_CPU_READ);
-  draw_set_mapped_vertex_buffer(draw, i, buf);
-   }
-
-   /* Map index buffer, if present */
-   if (indexBuffer) {
-  void *mapped_indexes
- = pipe_buffer_map(pipe-screen, indexBuffer,
-PIPE_BUFFER_USAGE_CPU_READ);
-  draw_set_mapped_element_buffer_range(draw, indexSize,
-   min_index,
-   max_index,
-   mapped_indexes);
-   }
-   else {
-  /* no index/element buffer */
-  draw_set_mapped_element_buffer_range(draw, 0, start,
-   start + count - 1, NULL);
-   }
-
-   /* draw! */
-   draw_arrays(draw, mode, start, count);
-
-   /*
-* unmap vertex/index buffers - will cause draw module to flush
-*/
-   for (i = 0; i  sp-num_vertex_buffers; i++) {
-  draw_set_mapped_vertex_buffer(draw, i, NULL);
-  pipe_buffer_unmap(pipe-screen, sp-vertex_buffer[i].buffer);
-   }
-   if (indexBuffer) {
-  draw_set_mapped_element_buffer(draw, 0, NULL);
-  pipe_buffer_unmap(pipe-screen, indexBuffer);
-   }
-
-
-   /* Note: leave drawing surfaces mapped */
-   softpipe_unmap_constant_buffers(sp);
-
-   sp-dirty_render_cache = TRUE;
-   
-   return TRUE;
+   return softpipe_draw_range_elements_instanced(pipe,
+ indexBuffer,
+ indexSize,
+

Mesa (instanced-arrays): sp: Implement draw_elements_instanced().

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: bccdb239c700e0c7c90d27a281d5246b958581b5
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=bccdb239c700e0c7c90d27a281d5246b958581b5

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 18:27:58 2009 +0100

sp: Implement draw_elements_instanced().

---

 src/gallium/drivers/softpipe/sp_context.c |1 +
 src/gallium/drivers/softpipe/sp_draw_arrays.c |   46 +++-
 src/gallium/drivers/softpipe/sp_state.h   |   10 +
 3 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_context.c 
b/src/gallium/drivers/softpipe/sp_context.c
index 406414a..969d69d 100644
--- a/src/gallium/drivers/softpipe/sp_context.c
+++ b/src/gallium/drivers/softpipe/sp_context.c
@@ -239,6 +239,7 @@ softpipe_create( struct pipe_screen *screen )
softpipe-pipe.draw_elements = softpipe_draw_elements;
softpipe-pipe.draw_range_elements = softpipe_draw_range_elements;
softpipe-pipe.draw_arrays_instanced = softpipe_draw_arrays_instanced;
+   softpipe-pipe.draw_elements_instanced = softpipe_draw_elements_instanced;
 
softpipe-pipe.clear = softpipe_clear;
softpipe-pipe.flush = softpipe_flush;
diff --git a/src/gallium/drivers/softpipe/sp_draw_arrays.c 
b/src/gallium/drivers/softpipe/sp_draw_arrays.c
index 6a593fb..debf5bf 100644
--- a/src/gallium/drivers/softpipe/sp_draw_arrays.c
+++ b/src/gallium/drivers/softpipe/sp_draw_arrays.c
@@ -193,6 +193,26 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
unsigned startInstance,
unsigned instanceCount)
 {
+   return softpipe_draw_elements_instanced(pipe,
+   NULL,
+   0,
+   mode,
+   start,
+   count,
+   startInstance,
+   instanceCount);
+}
+
+boolean
+softpipe_draw_elements_instanced(struct pipe_context *pipe,
+ struct pipe_buffer *indexBuffer,
+ unsigned indexSize,
+ unsigned mode,
+ unsigned start,
+ unsigned count,
+ unsigned startInstance,
+ unsigned instanceCount)
+{
struct softpipe_context *sp = softpipe_context(pipe);
struct draw_context *draw = sp-draw;
unsigned i;
@@ -216,8 +236,26 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
   draw_set_mapped_vertex_buffer(draw, i, buf);
}
 
-   draw_set_mapped_element_buffer_range(draw, 0, start,
-start + count - 1, NULL);
+   /* Map index buffer, if present */
+   if (indexBuffer) {
+  void *mapped_indexes;
+
+  mapped_indexes = pipe_buffer_map(pipe-screen,
+   indexBuffer,
+   PIPE_BUFFER_USAGE_CPU_READ);
+  draw_set_mapped_element_buffer_range(draw,
+   indexSize,
+   0,
+   0x,
+   mapped_indexes);
+   } else {
+  /* no index/element buffer */
+  draw_set_mapped_element_buffer_range(draw,
+   0,
+   start,
+   start + count - 1,
+   NULL);
+   }
 
/* draw! */
draw_arrays_instanced(draw, mode, start, count, startInstance, 
instanceCount);
@@ -227,6 +265,10 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
   draw_set_mapped_vertex_buffer(draw, i, NULL);
   pipe_buffer_unmap(pipe-screen, sp-vertex_buffer[i].buffer);
}
+   if (indexBuffer) {
+  draw_set_mapped_element_buffer(draw, 0, NULL);
+  pipe_buffer_unmap(pipe-screen, indexBuffer);
+   }
 
/* Note: leave drawing surfaces mapped */
softpipe_unmap_constant_buffers(sp);
diff --git a/src/gallium/drivers/softpipe/sp_state.h 
b/src/gallium/drivers/softpipe/sp_state.h
index 13935fd..00da41b 100644
--- a/src/gallium/drivers/softpipe/sp_state.h
+++ b/src/gallium/drivers/softpipe/sp_state.h
@@ -197,6 +197,16 @@ softpipe_draw_arrays_instanced(struct pipe_context *pipe,
unsigned startInstance,
unsigned instanceCount);
 
+boolean
+softpipe_draw_elements_instanced(struct pipe_context *pipe,
+ struct pipe_buffer *indexBuffer,
+ unsigned indexSize,
+ unsigned mode,
+ unsigned 

Mesa (instanced-arrays): draw: Implement draw_arrays() in terms of draw_arrays_instanced().

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 6481f40eec0a6c5dea4a74a11b83415478f2c814
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6481f40eec0a6c5dea4a74a11b83415478f2c814

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 18:54:04 2009 +0100

draw: Implement draw_arrays() in terms of draw_arrays_instanced().

---

 src/gallium/auxiliary/draw/draw_pt.c |   44 ++
 1 files changed, 18 insertions(+), 26 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pt.c 
b/src/gallium/auxiliary/draw/draw_pt.c
index 1217b9e..a5ddec5 100644
--- a/src/gallium/auxiliary/draw/draw_pt.c
+++ b/src/gallium/auxiliary/draw/draw_pt.c
@@ -280,20 +280,33 @@ void
 draw_arrays(struct draw_context *draw, unsigned prim,
 unsigned start, unsigned count)
 {
-   unsigned reduced_prim = u_reduced_prim(prim);
+   draw_arrays_instanced(draw, prim, start, count, 0, 1);
+}
+
+void
+draw_arrays_instanced(struct draw_context *draw,
+  unsigned mode,
+  unsigned start,
+  unsigned count,
+  unsigned startInstance,
+  unsigned instanceCount)
+{
+   unsigned reduced_prim = u_reduced_prim(mode);
+   unsigned instance;
+
if (reduced_prim != draw-reduced_prim) {
-  draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE );
+  draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE);
   draw-reduced_prim = reduced_prim;
}
 
if (0)
-  draw_print_arrays(draw, prim, start, MIN2(count, 20));
+  draw_print_arrays(draw, mode, start, MIN2(count, 20));
 
 #if 0
{
   int i;
-  debug_printf(draw_arrays(prim=%u start=%u count=%u):\n,
-   prim, start, count);
+  debug_printf(draw_arrays(mode=%u start=%u count=%u):\n,
+   mode, start, count);
   tgsi_dump(draw-vs.vertex_shader-state.tokens, 0);
   debug_printf(Elements:\n);
   for (i = 0; i  draw-pt.nr_vertex_elements; i++) {
@@ -311,27 +324,6 @@ draw_arrays(struct draw_context *draw, unsigned prim,
}
 #endif
 
-   /* drawing done here: */
-   draw-instance_id = 0;
-   draw_pt_arrays(draw, prim, start, count);
-}
-
-void
-draw_arrays_instanced(struct draw_context *draw,
-  unsigned mode,
-  unsigned start,
-  unsigned count,
-  unsigned startInstance,
-  unsigned instanceCount)
-{
-   unsigned reduced_prim = u_reduced_prim(mode);
-   unsigned instance;
-
-   if (reduced_prim != draw-reduced_prim) {
-  draw_do_flush(draw, DRAW_FLUSH_STATE_CHANGE);
-  draw-reduced_prim = reduced_prim;
-   }
-
for (instance = 0; instance  instanceCount; instance++) {
   draw-instance_id = instance + startInstance;
   draw_pt_arrays(draw, mode, start, count);

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (instanced-arrays): Implement instanced indexed draw.

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 5007e39f76c897b8f3aa4acf6086c8b7ac30bdef
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=5007e39f76c897b8f3aa4acf6086c8b7ac30bdef

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 18:26:40 2009 +0100

Implement instanced indexed draw.

---

 src/gallium/auxiliary/draw/draw_pt_fetch.c |1 +
 src/gallium/auxiliary/draw/draw_pt_fetch_emit.c|1 +
 src/gallium/auxiliary/draw/draw_vs_varient.c   |1 +
 src/gallium/auxiliary/translate/translate.h|1 +
 .../auxiliary/translate/translate_generic.c|   14 +++---
 src/gallium/auxiliary/translate/translate_sse.c|   20 +++-
 6 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c 
b/src/gallium/auxiliary/draw/draw_pt_fetch.c
index e8174a2..f88a839 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c
@@ -160,6 +160,7 @@ void draw_pt_fetch_run( struct pt_fetch *fetch,
translate-run_elts( translate,
elts, 
count,
+draw-instance_id,
verts );
 
 }
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c 
b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
index 40bfc0f..771d94b 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch_emit.c
@@ -257,6 +257,7 @@ static void fetch_emit_run( struct draw_pt_middle_end 
*middle,
feme-translate-run_elts( feme-translate, 
  fetch_elts,
  fetch_count,
+  draw-instance_id,
  hw_verts );
 
if (0) {
diff --git a/src/gallium/auxiliary/draw/draw_vs_varient.c 
b/src/gallium/auxiliary/draw/draw_vs_varient.c
index 4cc080f..8e14bdd 100644
--- a/src/gallium/auxiliary/draw/draw_vs_varient.c
+++ b/src/gallium/auxiliary/draw/draw_vs_varient.c
@@ -142,6 +142,7 @@ static void PIPE_CDECL vsvg_run_elts( struct 
draw_vs_varient *varient,
vsvg-fetch-run_elts( vsvg-fetch, 
   elts,
   count,
+  vsvg-draw-instance_id,
   temp_buffer );
 
vsvg-base.vs-run_linear( vsvg-base.vs, 
diff --git a/src/gallium/auxiliary/translate/translate.h 
b/src/gallium/auxiliary/translate/translate.h
index fb29847..9ae7a48 100644
--- a/src/gallium/auxiliary/translate/translate.h
+++ b/src/gallium/auxiliary/translate/translate.h
@@ -75,6 +75,7 @@ struct translate {
void (PIPE_CDECL *run_elts)( struct translate *,
 const unsigned *elts,
 unsigned count,
+unsigned instance_id,
 void *output_buffer);
 
void (PIPE_CDECL *run)( struct translate *,
diff --git a/src/gallium/auxiliary/translate/translate_generic.c 
b/src/gallium/auxiliary/translate/translate_generic.c
index 0fa9927..742f03b 100644
--- a/src/gallium/auxiliary/translate/translate_generic.c
+++ b/src/gallium/auxiliary/translate/translate_generic.c
@@ -569,6 +569,7 @@ static emit_func get_emit_func( enum pipe_format format )
 static void PIPE_CDECL generic_run_elts( struct translate *translate,
  const unsigned *elts,
  unsigned count,
+ unsigned instance_id,
  void *output_buffer )
 {
struct translate_generic *tg = translate_generic(translate);
@@ -584,13 +585,20 @@ static void PIPE_CDECL generic_run_elts( struct translate 
*translate,
 
   for (attr = 0; attr  nr_attrs; attr++) {
 float data[4];
-
-const char *src = (tg-attrib[attr].input_ptr + 
-   tg-attrib[attr].input_stride * elt);
+ const char *src;
 
 char *dst = (vert + 
  tg-attrib[attr].output_offset);
 
+ if (tg-attrib[attr].instance_divisor) {
+src = tg-attrib[attr].input_ptr +
+  tg-attrib[attr].input_stride *
+  (instance_id / tg-attrib[attr].instance_divisor);
+ } else {
+src = tg-attrib[attr].input_ptr +
+  tg-attrib[attr].input_stride * elt;
+ }
+
 tg-attrib[attr].fetch( src, data );
 
  if (0) debug_printf(vert %d/%d attr %d: %f %f %f %f\n,
diff --git a/src/gallium/auxiliary/translate/translate_sse.c 
b/src/gallium/auxiliary/translate/translate_sse.c
index ffc5fe9..ba4a246 100644
--- a/src/gallium/auxiliary/translate/translate_sse.c
+++ b/src/gallium/auxiliary/translate/translate_sse.c
@@ -376,13 +376,14 @@ static boolean init_inputs( struct translate_sse *p,
 boolean linear )
 {
unsigned i;
-   if (linear) {
-  struct x86_reg 

Mesa (mesa_7_7_branch): progs/glsl: Provide a better fix for fgets warning.

2009-12-30 Thread Vinson Lee
Module: Mesa
Branch: mesa_7_7_branch
Commit: 5b2713c92a89fc6c47c3546d36eeb549e126ebc0
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=5b2713c92a89fc6c47c3546d36eeb549e126ebc0

Author: Vinson Lee v...@vmware.com
Date:   Wed Dec 30 12:38:21 2009 -0800

progs/glsl: Provide a better fix for fgets warning.

---

 progs/glsl/shtest.c |7 ++-
 1 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/progs/glsl/shtest.c b/progs/glsl/shtest.c
index 3c79543..e9800c3 100644
--- a/progs/glsl/shtest.c
+++ b/progs/glsl/shtest.c
@@ -492,11 +492,8 @@ ReadConfigFile(const char *filename, struct config_file 
*conf)
conf-num_uniforms = 0;
 
/* ugly but functional parser */
-   while (!feof(f)) {
-  char *result;
-  result = fgets(line, sizeof(line), f);
-  (void) result;
-  if (!feof(f)  line[0]) {
+   while (fgets(line, sizeof(line), f) != NULL) {
+  if (line[0]) {
  if (strncmp(line, vs , 3) == 0) {
 VertShaderFile = strdup(line + 3);
 VertShaderFile[strlen(VertShaderFile) - 1] = 0;

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (instanced-arrays): tgsi: Support system values in ureg.

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 5754185d39c147cd81b97fd331ccf78aebfad5e7
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=5754185d39c147cd81b97fd331ccf78aebfad5e7

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 21:52:01 2009 +0100

tgsi: Support system values in ureg.

---

 src/gallium/auxiliary/tgsi/tgsi_ureg.c |   36 
 src/gallium/auxiliary/tgsi/tgsi_ureg.h |6 +
 2 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index 1e730e5..2713372 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -64,6 +64,7 @@ struct ureg_tokens {
 };
 
 #define UREG_MAX_INPUT PIPE_MAX_ATTRIBS
+#define UREG_MAX_SYSTEM_VALUE PIPE_MAX_ATTRIBS
 #define UREG_MAX_OUTPUT PIPE_MAX_ATTRIBS
 #define UREG_MAX_CONSTANT_RANGE 32
 #define UREG_MAX_IMMEDIATE 32
@@ -95,6 +96,13 @@ struct ureg_program
unsigned nr_gs_inputs;
 
struct {
+  unsigned index;
+  unsigned semantic_name;
+  unsigned semantic_index;
+   } system_value[UREG_MAX_SYSTEM_VALUE];
+   unsigned nr_system_values;
+
+   struct {
   unsigned semantic_name;
   unsigned semantic_index;
} output[UREG_MAX_OUTPUT];
@@ -299,6 +307,25 @@ ureg_DECL_gs_input(struct ureg_program *ureg,
 }
 
 
+struct ureg_src
+ureg_DECL_system_value(struct ureg_program *ureg,
+   unsigned index,
+   unsigned semantic_name,
+   unsigned semantic_index)
+{
+   if (ureg-nr_system_values  UREG_MAX_SYSTEM_VALUE) {
+  ureg-system_value[ureg-nr_system_values].index = index;
+  ureg-system_value[ureg-nr_system_values].semantic_name = semantic_name;
+  ureg-system_value[ureg-nr_system_values].semantic_index = 
semantic_index;
+  ureg-nr_system_values++;
+   } else {
+  set_bad(ureg);
+   }
+
+   return ureg_src_register(TGSI_FILE_SYSTEM_VALUE, index);
+}
+
+
 struct ureg_dst 
 ureg_DECL_output( struct ureg_program *ureg,
   unsigned name,
@@ -1003,6 +1030,15 @@ static void emit_decls( struct ureg_program *ureg )
   }
}
 
+   for (i = 0; i  ureg-nr_system_values; i++) {
+  emit_decl(ureg,
+TGSI_FILE_SYSTEM_VALUE,
+ureg-system_value[i].index,
+ureg-system_value[i].semantic_name,
+ureg-system_value[i].semantic_index,
+TGSI_INTERPOLATE_CONSTANT);
+   }
+
for (i = 0; i  ureg-nr_outputs; i++) {
   emit_decl( ureg, 
  TGSI_FILE_OUTPUT, 
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h 
b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index 7e3e7bc..179862d 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -137,6 +137,12 @@ struct ureg_src
 ureg_DECL_gs_input(struct ureg_program *,
unsigned index);
 
+struct ureg_src
+ureg_DECL_system_value(struct ureg_program *,
+   unsigned index,
+   unsigned semantic_name,
+   unsigned semantic_index);
+
 struct ureg_dst
 ureg_DECL_output( struct ureg_program *,
   unsigned semantic_name,

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (instanced-arrays): Add lame support for instanceID to draw module.

2009-12-30 Thread Michał Król
Module: Mesa
Branch: instanced-arrays
Commit: 543b9566bdaa48fea2df1866fa1310c1cdbcde27
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=543b9566bdaa48fea2df1866fa1310c1cdbcde27

Author: Michal Krol mic...@vmware.com
Date:   Wed Dec 30 22:18:53 2009 +0100

Add lame support for instanceID to draw module.

It's all screaming for integer support -- fake it with float for now.

---

 src/gallium/auxiliary/draw/draw_pipe_vbuf.c|3 +-
 src/gallium/auxiliary/draw/draw_pt.h   |3 +-
 src/gallium/auxiliary/draw/draw_pt_emit.c  |3 +-
 src/gallium/auxiliary/draw/draw_pt_fetch.c |   32 +++---
 src/gallium/auxiliary/draw/draw_pt_fetch_emit.c|1 +
 .../auxiliary/draw/draw_pt_fetch_shade_pipeline.c  |   14 -
 src/gallium/auxiliary/draw/draw_vs_varient.c   |3 +
 src/gallium/auxiliary/translate/translate.h|6 ++
 .../auxiliary/translate/translate_generic.c|   26 +---
 src/gallium/auxiliary/translate/translate_sse.c|   70 +--
 src/gallium/drivers/svga/svga_state_vs.c   |1 +
 11 files changed, 118 insertions(+), 44 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c 
b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
index bb8a8ff..d40c035 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_vbuf.c
@@ -271,7 +271,8 @@ vbuf_start_prim( struct vbuf_stage *vbuf, uint prim )
 emit_sz = 0;
 break;
   }
-  
+
+  hw_key.element[i].type = TRANSLATE_ELEMENT_NORMAL;
   hw_key.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
   hw_key.element[i].input_buffer = src_buffer;
   hw_key.element[i].input_offset = src_offset;
diff --git a/src/gallium/auxiliary/draw/draw_pt.h 
b/src/gallium/auxiliary/draw/draw_pt.h
index 20edf7a..d5e0d92 100644
--- a/src/gallium/auxiliary/draw/draw_pt.h
+++ b/src/gallium/auxiliary/draw/draw_pt.h
@@ -183,7 +183,8 @@ struct pt_emit *draw_pt_emit_create( struct draw_context 
*draw );
 struct pt_fetch;
 void draw_pt_fetch_prepare( struct pt_fetch *fetch,
 unsigned vertex_input_count,
-   unsigned vertex_size );
+unsigned vertex_size,
+unsigned instance_id_index );
 
 void draw_pt_fetch_run( struct pt_fetch *fetch,
const unsigned *elts,
diff --git a/src/gallium/auxiliary/draw/draw_pt_emit.c 
b/src/gallium/auxiliary/draw/draw_pt_emit.c
index d0abeb9..4fb5327 100644
--- a/src/gallium/auxiliary/draw/draw_pt_emit.c
+++ b/src/gallium/auxiliary/draw/draw_pt_emit.c
@@ -121,7 +121,8 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
 emit_sz = 0;
 break;
   }
-  
+
+  hw_key.element[i].type = TRANSLATE_ELEMENT_NORMAL;
   hw_key.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
   hw_key.element[i].input_buffer = src_buffer;
   hw_key.element[i].input_offset = src_offset;
diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c 
b/src/gallium/auxiliary/draw/draw_pt_fetch.c
index f88a839..36c27e2 100644
--- a/src/gallium/auxiliary/draw/draw_pt_fetch.c
+++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c
@@ -58,12 +58,14 @@ struct pt_fetch {
  */
 void draw_pt_fetch_prepare( struct pt_fetch *fetch,
 unsigned vs_input_count,
-   unsigned vertex_size )
+unsigned vertex_size,
+unsigned instance_id_index )
 {
struct draw_context *draw = fetch-draw;
unsigned nr_inputs;
-   unsigned i, nr = 0;
+   unsigned i, nr = 0, ei = 0;
unsigned dst_offset = 0;
+   unsigned num_extra_inputs = 0;
struct translate_key key;
 
fetch-vertex_size = vertex_size;
@@ -78,6 +80,7 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
{
   /* Need to set header-vertex_id = 0x somehow.
*/
+  key.element[nr].type = TRANSLATE_ELEMENT_NORMAL;
   key.element[nr].input_format = PIPE_FORMAT_R32_FLOAT;
   key.element[nr].input_buffer = draw-pt.nr_vertex_buffers;
   key.element[nr].input_offset = 0;
@@ -92,16 +95,27 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
*/
   dst_offset += 4 * sizeof(float);
}
-  
-   assert( draw-pt.nr_vertex_elements = vs_input_count );
 
-   nr_inputs = MIN2( vs_input_count, draw-pt.nr_vertex_elements );
+   if (instance_id_index != ~0) {
+  num_extra_inputs++;
+   }
+
+   assert(draw-pt.nr_vertex_elements + num_extra_inputs = vs_input_count);
+
+   nr_inputs = MIN2(vs_input_count, draw-pt.nr_vertex_elements + 
num_extra_inputs);
 
for (i = 0; i  nr_inputs; i++) {
-  key.element[nr].input_format = draw-pt.vertex_element[i].src_format;
-  key.element[nr].input_buffer = 
draw-pt.vertex_element[i].vertex_buffer_index;
-  key.element[nr].input_offset = draw-pt.vertex_element[i].src_offset;
-