X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Fdraw%2Fdraw_pt_fetch.c;h=3740deab5a88dfdfe7233e479f4503fe724cf054;hb=2f13f28120fdfe2f5a64e87b4ec19db94bf63713;hp=ae12ee24bdc36b2b7cfad30345a5712a4085e7a3;hpb=1218430e1200a08cd64b6555d3fd1fd0274ad9e5;p=mesa.git diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch.c b/src/gallium/auxiliary/draw/draw_pt_fetch.c index ae12ee24bdc..3740deab5a8 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch.c @@ -27,6 +27,7 @@ #include "util/u_memory.h" #include "util/u_math.h" +#include "util/u_format.h" #include "draw/draw_context.h" #include "draw/draw_private.h" #include "draw/draw_pt.h" @@ -45,7 +46,8 @@ struct pt_fetch { }; -/* Perform the fetch from API vertex elements & vertex buffers, to a +/** + * Perform the fetch from API vertex elements & vertex buffers, to a * contiguous set of float[4] attributes as required for the * vertex_shader->run_linear() method. * @@ -54,10 +56,11 @@ struct pt_fetch { * directly to hw vertices. * */ -void draw_pt_fetch_prepare( struct pt_fetch *fetch, - unsigned vs_input_count, - unsigned vertex_size, - unsigned instance_id_index ) +void +draw_pt_fetch_prepare(struct pt_fetch *fetch, + unsigned vs_input_count, + unsigned vertex_size, + unsigned instance_id_index) { struct draw_context *draw = fetch->draw; unsigned nr_inputs; @@ -71,9 +74,9 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch, /* Leave the clipmask/edgeflags/pad/vertex_id untouched */ dst_offset += 1 * sizeof(float); - /* Just leave the clip[] array untouched. + /* Just leave the clip[] and pre_clip_pos[] array untouched. */ - dst_offset += 4 * sizeof(float); + dst_offset += 8 * sizeof(float); if (instance_id_index != ~0) { num_extra_inputs++; @@ -91,6 +94,28 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch, key.element[nr].output_offset = dst_offset; dst_offset += sizeof(uint); + } else if (util_format_is_pure_sint(draw->pt.vertex_element[i].src_format)) { + key.element[nr].type = TRANSLATE_ELEMENT_NORMAL; + key.element[nr].input_format = draw->pt.vertex_element[ei].src_format; + key.element[nr].input_buffer = draw->pt.vertex_element[ei].vertex_buffer_index; + key.element[nr].input_offset = draw->pt.vertex_element[ei].src_offset; + key.element[nr].instance_divisor = draw->pt.vertex_element[ei].instance_divisor; + key.element[nr].output_format = PIPE_FORMAT_R32G32B32A32_SINT; + key.element[nr].output_offset = dst_offset; + + ei++; + dst_offset += 4 * sizeof(int); + } else if (util_format_is_pure_uint(draw->pt.vertex_element[i].src_format)) { + key.element[nr].type = TRANSLATE_ELEMENT_NORMAL; + key.element[nr].input_format = draw->pt.vertex_element[ei].src_format; + key.element[nr].input_buffer = draw->pt.vertex_element[ei].vertex_buffer_index; + key.element[nr].input_offset = draw->pt.vertex_element[ei].src_offset; + key.element[nr].instance_divisor = draw->pt.vertex_element[ei].instance_divisor; + key.element[nr].output_format = PIPE_FORMAT_R32G32B32A32_UINT; + key.element[nr].output_offset = dst_offset; + + ei++; + dst_offset += 4 * sizeof(unsigned); } else { key.element[nr].type = TRANSLATE_ELEMENT_NORMAL; key.element[nr].input_format = draw->pt.vertex_element[ei].src_format; @@ -118,43 +143,41 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch, translate_key_sanitize(&key); fetch->translate = translate_cache_find(fetch->cache, &key); } - } - - -void draw_pt_fetch_run( struct pt_fetch *fetch, - const unsigned *elts, - unsigned count, - char *verts ) +void +draw_pt_fetch_run(struct pt_fetch *fetch, + const unsigned *elts, + unsigned count, + char *verts) { struct draw_context *draw = fetch->draw; struct translate *translate = fetch->translate; unsigned i; for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { - translate->set_buffer(translate, - i, - ((char *)draw->pt.user.vbuffer[i] + + translate->set_buffer(translate, + i, + ((char *)draw->pt.user.vbuffer[i].map + draw->pt.vertex_buffer[i].buffer_offset), draw->pt.vertex_buffer[i].stride, - draw->pt.vertex_buffer[i].max_index); + draw->pt.max_index); } translate->run_elts( translate, - elts, + elts, count, draw->instance_id, verts ); - } -void draw_pt_fetch_run_linear( struct pt_fetch *fetch, - unsigned start, - unsigned count, - char *verts ) +void +draw_pt_fetch_run_linear(struct pt_fetch *fetch, + unsigned start, + unsigned count, + char *verts) { struct draw_context *draw = fetch->draw; struct translate *translate = fetch->translate; @@ -163,10 +186,10 @@ void draw_pt_fetch_run_linear( struct pt_fetch *fetch, for (i = 0; i < draw->pt.nr_vertex_buffers; i++) { translate->set_buffer(translate, i, - ((char *)draw->pt.user.vbuffer[i] + + ((char *)draw->pt.user.vbuffer[i].map + draw->pt.vertex_buffer[i].buffer_offset), draw->pt.vertex_buffer[i].stride, - draw->pt.vertex_buffer[i].max_index); + draw->pt.max_index); } translate->run( translate, @@ -177,7 +200,8 @@ void draw_pt_fetch_run_linear( struct pt_fetch *fetch, } -struct pt_fetch *draw_pt_fetch_create( struct draw_context *draw ) +struct pt_fetch * +draw_pt_fetch_create(struct draw_context *draw) { struct pt_fetch *fetch = CALLOC_STRUCT(pt_fetch); if (!fetch) @@ -193,11 +217,12 @@ struct pt_fetch *draw_pt_fetch_create( struct draw_context *draw ) return fetch; } -void draw_pt_fetch_destroy( struct pt_fetch *fetch ) + +void +draw_pt_fetch_destroy(struct pt_fetch *fetch) { if (fetch->cache) translate_cache_destroy(fetch->cache); FREE(fetch); } -