mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-14 22:00:28 +01:00
Merge commit 'origin/gallium-0.1' into gallium-tex-surfaces
This commit is contained in:
commit
2f9b1b9cc2
5 changed files with 44 additions and 17 deletions
|
|
@ -42,6 +42,7 @@
|
|||
#include "draw_vertex.h"
|
||||
#include "draw_pipe.h"
|
||||
#include "translate/translate.h"
|
||||
#include "translate/translate_cache.h"
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -75,6 +76,8 @@ struct vbuf_stage {
|
|||
/* Cache point size somewhere it's address won't change:
|
||||
*/
|
||||
float point_size;
|
||||
|
||||
struct translate_cache *cache;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -220,7 +223,6 @@ vbuf_set_prim( struct vbuf_stage *vbuf, uint prim )
|
|||
/* Translate from pipeline vertices to hw vertices.
|
||||
*/
|
||||
dst_offset = 0;
|
||||
memset(&hw_key, 0, sizeof(hw_key));
|
||||
|
||||
for (i = 0; i < vbuf->vinfo->num_attribs; i++) {
|
||||
unsigned emit_sz = 0;
|
||||
|
|
@ -277,12 +279,10 @@ vbuf_set_prim( struct vbuf_stage *vbuf, uint prim )
|
|||
/* Don't bother with caching at this stage:
|
||||
*/
|
||||
if (!vbuf->translate ||
|
||||
memcmp(&vbuf->translate->key, &hw_key, sizeof(hw_key)) != 0)
|
||||
translate_key_compare(&vbuf->translate->key, &hw_key) != 0)
|
||||
{
|
||||
if (vbuf->translate)
|
||||
vbuf->translate->release(vbuf->translate);
|
||||
|
||||
vbuf->translate = translate_create( &hw_key );
|
||||
translate_key_sanitize(&hw_key);
|
||||
vbuf->translate = translate_cache_find(vbuf->cache, &hw_key);
|
||||
|
||||
vbuf->translate->set_buffer(vbuf->translate, 1, &vbuf->point_size, 0);
|
||||
}
|
||||
|
|
@ -433,6 +433,9 @@ static void vbuf_destroy( struct draw_stage *stage )
|
|||
if (vbuf->render)
|
||||
vbuf->render->destroy( vbuf->render );
|
||||
|
||||
if (vbuf->cache)
|
||||
translate_cache_destroy(vbuf->cache);
|
||||
|
||||
FREE( stage );
|
||||
}
|
||||
|
||||
|
|
@ -463,6 +466,11 @@ struct draw_stage *draw_vbuf_stage( struct draw_context *draw,
|
|||
16 );
|
||||
if (!vbuf->indices)
|
||||
goto fail;
|
||||
|
||||
vbuf->cache = translate_cache_create();
|
||||
if (!vbuf->cache)
|
||||
goto fail;
|
||||
|
||||
|
||||
vbuf->vertices = NULL;
|
||||
vbuf->vertex_ptr = vbuf->vertices;
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
|
|||
const struct vertex_info *vinfo;
|
||||
unsigned dst_offset;
|
||||
struct translate_key hw_key;
|
||||
unsigned keysize;
|
||||
unsigned i;
|
||||
boolean ok;
|
||||
|
||||
|
|
@ -62,7 +61,7 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
|
|||
/* Must do this after set_primitive() above:
|
||||
*/
|
||||
vinfo = draw->render->get_vertex_info(draw->render);
|
||||
keysize = 2*4 + vinfo->num_attribs * sizeof(hw_key.element[0]);
|
||||
|
||||
|
||||
/* Translate from pipeline vertices to hw vertices.
|
||||
*/
|
||||
|
|
@ -121,9 +120,9 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
|
|||
hw_key.output_stride = vinfo->size * 4;
|
||||
|
||||
if (!emit->translate ||
|
||||
memcmp(&emit->translate->key, &hw_key, keysize) != 0)
|
||||
translate_key_compare(&emit->translate->key, &hw_key) != 0)
|
||||
{
|
||||
memset((char *)&hw_key + keysize, 0, sizeof(hw_key) - keysize);
|
||||
translate_key_sanitize(&hw_key);
|
||||
emit->translate = translate_cache_find(emit->cache, &hw_key);
|
||||
}
|
||||
}
|
||||
|
|
@ -197,7 +196,8 @@ struct pt_emit *draw_pt_emit_create( struct draw_context *draw )
|
|||
|
||||
void draw_pt_emit_destroy( struct pt_emit *emit )
|
||||
{
|
||||
translate_cache_destroy(emit->cache);
|
||||
if (emit->cache)
|
||||
translate_cache_destroy(emit->cache);
|
||||
|
||||
FREE(emit);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,11 +62,8 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
|
|||
unsigned i, nr = 0;
|
||||
unsigned dst_offset = 0;
|
||||
struct translate_key key;
|
||||
unsigned keysize;
|
||||
|
||||
fetch->vertex_size = vertex_size;
|
||||
keysize = (2*4 +
|
||||
(draw->pt.nr_vertex_elements + 1) * sizeof(key.element[0]));
|
||||
|
||||
/* Always emit/leave space for a vertex header.
|
||||
*
|
||||
|
|
@ -111,9 +108,9 @@ void draw_pt_fetch_prepare( struct pt_fetch *fetch,
|
|||
|
||||
|
||||
if (!fetch->translate ||
|
||||
memcmp(&fetch->translate->key, &key, keysize) != 0)
|
||||
translate_key_compare(&fetch->translate->key, &key) != 0)
|
||||
{
|
||||
memset((char *)&key + keysize, 0, sizeof(key) - keysize);
|
||||
translate_key_sanitize(&key);
|
||||
fetch->translate = translate_cache_find(fetch->cache, &key);
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -174,8 +174,9 @@ static void fetch_emit_prepare( struct draw_pt_middle_end *middle,
|
|||
/* Don't bother with caching at this stage:
|
||||
*/
|
||||
if (!feme->translate ||
|
||||
memcmp(&feme->translate->key, &key, sizeof(key)) != 0)
|
||||
translate_key_compare(&feme->translate->key, &key) != 0)
|
||||
{
|
||||
translate_key_sanitize(&key);
|
||||
feme->translate = translate_cache_find(feme->cache,
|
||||
&key);
|
||||
|
||||
|
|
|
|||
|
|
@ -95,6 +95,27 @@ struct translate *translate_lookup_or_create( struct translate_context *tctx,
|
|||
|
||||
struct translate *translate_create( const struct translate_key *key );
|
||||
|
||||
static INLINE int translate_keysize( const struct translate_key *key )
|
||||
{
|
||||
return 2 * sizeof(int) + key->nr_elements * sizeof(struct translate_element);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
static INLINE void translate_key_sanitize( struct translate_key *a )
|
||||
{
|
||||
int keysize = translate_keysize(a);
|
||||
char *ptr = (char *)a;
|
||||
memset(ptr + keysize, 0, sizeof(*a) - keysize);
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Private:
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue