Mesa (instanced-arrays): gallium: Move instance_divisor field from vertex_buffer to vertex_element.
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().
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.
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().
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 .
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
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.
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
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
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
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
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
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
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
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.
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().
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().
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.
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.
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.
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.
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; -