mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
gallium: Emit constants.
This commit is contained in:
parent
8a88f5e40f
commit
c74f4a10f9
4 changed files with 62 additions and 16 deletions
|
|
@ -182,6 +182,9 @@ unsigned draw_vf_set_vertex_attributes( struct draw_vertex_fetch *vf,
|
|||
vf->attr[j].insert = draw_vf_format_info[format].insert;
|
||||
vf->attr[j].vertattrsize = draw_vf_format_info[format].attrsize;
|
||||
vf->attr[j].vertoffset = offset;
|
||||
vf->attr[j].isconst = draw_vf_format_info[format].isconst;
|
||||
if(vf->attr[j].isconst)
|
||||
memcpy(vf->attr[j].data, &map[i].data, vf->attr[j].vertattrsize);
|
||||
|
||||
if (DBG)
|
||||
_mesa_printf("%d: %s, offset %d\n", i,
|
||||
|
|
@ -240,8 +243,11 @@ void draw_vf_set_data( struct draw_vertex_fetch *vf,
|
|||
for (j = 0; j < vf->attr_count; j++) {
|
||||
a[j].inputstride = 0; /* XXX: one-vertex-max ATM */
|
||||
a[j].inputsize = 4;
|
||||
a[j].do_insert = a[j].insert[4 - 1];
|
||||
a[j].inputptr = (uint8_t *)&data[a[j].attrib][0];
|
||||
a[j].do_insert = a[j].insert[4 - 1];
|
||||
if(a[j].isconst)
|
||||
a[j].inputptr = a[j].data;
|
||||
else
|
||||
a[j].inputptr = (uint8_t *)&data[a[j].attrib][0];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -48,14 +48,30 @@ enum draw_vf_attr_format {
|
|||
DRAW_EMIT_4UB_4F_BGRA, /**< for color */
|
||||
DRAW_EMIT_4UB_4F_ARGB, /**< for color */
|
||||
DRAW_EMIT_4UB_4F_ABGR, /**< for color */
|
||||
DRAW_EMIT_1F_CONST,
|
||||
DRAW_EMIT_2F_CONST,
|
||||
DRAW_EMIT_3F_CONST,
|
||||
DRAW_EMIT_4F_CONST,
|
||||
DRAW_EMIT_PAD, /**< leave a hole of 'offset' bytes */
|
||||
DRAW_EMIT_MAX
|
||||
};
|
||||
|
||||
struct draw_vf_attr_map {
|
||||
struct draw_vf_attr_map
|
||||
{
|
||||
/** Input attribute number */
|
||||
unsigned attrib;
|
||||
|
||||
enum draw_vf_attr_format format;
|
||||
|
||||
unsigned offset;
|
||||
|
||||
/**
|
||||
* Constant data for DRAW_EMIT_*_CONST
|
||||
*/
|
||||
union {
|
||||
uint8_t ub[4];
|
||||
float f[4];
|
||||
} data;
|
||||
};
|
||||
|
||||
struct draw_vertex_fetch;
|
||||
|
|
@ -124,6 +140,9 @@ struct draw_vf_attr
|
|||
unsigned inputsize;
|
||||
unsigned inputstride;
|
||||
unsigned vertoffset; /**< position of the attrib in the vertex struct */
|
||||
|
||||
boolean isconst; /**< read from const data below */
|
||||
uint8_t data[16];
|
||||
|
||||
unsigned attrib; /**< which vertex attrib (0=position, etc) */
|
||||
unsigned vertattrsize; /**< size of the attribute in bytes */
|
||||
|
|
@ -193,6 +212,7 @@ struct draw_vf_format_info {
|
|||
const char *name;
|
||||
draw_vf_insert_func insert[4];
|
||||
const unsigned attrsize;
|
||||
const boolean isconst;
|
||||
};
|
||||
|
||||
extern const struct draw_vf_format_info
|
||||
|
|
|
|||
|
|
@ -387,62 +387,78 @@ const struct draw_vf_format_info draw_vf_format_info[DRAW_EMIT_MAX] =
|
|||
{
|
||||
{ "1f",
|
||||
{ insert_1f_1, insert_1f_1, insert_1f_1, insert_1f_1 },
|
||||
sizeof(float) },
|
||||
sizeof(float), FALSE },
|
||||
|
||||
{ "2f",
|
||||
{ insert_2f_1, insert_2f_2, insert_2f_2, insert_2f_2 },
|
||||
2 * sizeof(float) },
|
||||
2 * sizeof(float), FALSE },
|
||||
|
||||
{ "3f",
|
||||
{ insert_3f_1, insert_3f_2, insert_3f_3, insert_3f_3 },
|
||||
3 * sizeof(float) },
|
||||
3 * sizeof(float), FALSE },
|
||||
|
||||
{ "4f",
|
||||
{ insert_4f_1, insert_4f_2, insert_4f_3, insert_4f_4 },
|
||||
4 * sizeof(float) },
|
||||
4 * sizeof(float), FALSE },
|
||||
|
||||
{ "3f_xyw",
|
||||
{ insert_3f_xyw_err, insert_3f_xyw_err, insert_3f_xyw_err,
|
||||
insert_3f_xyw_4 },
|
||||
3 * sizeof(float) },
|
||||
3 * sizeof(float), FALSE },
|
||||
|
||||
{ "1ub_1f",
|
||||
{ insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1, insert_1ub_1f_1 },
|
||||
sizeof(uint8_t) },
|
||||
sizeof(uint8_t), FALSE },
|
||||
|
||||
{ "3ub_3f_rgb",
|
||||
{ insert_3ub_3f_rgb_1, insert_3ub_3f_rgb_2, insert_3ub_3f_rgb_3,
|
||||
insert_3ub_3f_rgb_3 },
|
||||
3 * sizeof(uint8_t) },
|
||||
3 * sizeof(uint8_t), FALSE },
|
||||
|
||||
{ "3ub_3f_bgr",
|
||||
{ insert_3ub_3f_bgr_1, insert_3ub_3f_bgr_2, insert_3ub_3f_bgr_3,
|
||||
insert_3ub_3f_bgr_3 },
|
||||
3 * sizeof(uint8_t) },
|
||||
3 * sizeof(uint8_t), FALSE },
|
||||
|
||||
{ "4ub_4f_rgba",
|
||||
{ insert_4ub_4f_rgba_1, insert_4ub_4f_rgba_2, insert_4ub_4f_rgba_3,
|
||||
insert_4ub_4f_rgba_4 },
|
||||
4 * sizeof(uint8_t) },
|
||||
4 * sizeof(uint8_t), FALSE },
|
||||
|
||||
{ "4ub_4f_bgra",
|
||||
{ insert_4ub_4f_bgra_1, insert_4ub_4f_bgra_2, insert_4ub_4f_bgra_3,
|
||||
insert_4ub_4f_bgra_4 },
|
||||
4 * sizeof(uint8_t) },
|
||||
4 * sizeof(uint8_t), FALSE },
|
||||
|
||||
{ "4ub_4f_argb",
|
||||
{ insert_4ub_4f_argb_1, insert_4ub_4f_argb_2, insert_4ub_4f_argb_3,
|
||||
insert_4ub_4f_argb_4 },
|
||||
4 * sizeof(uint8_t) },
|
||||
4 * sizeof(uint8_t), FALSE },
|
||||
|
||||
{ "4ub_4f_abgr",
|
||||
{ insert_4ub_4f_abgr_1, insert_4ub_4f_abgr_2, insert_4ub_4f_abgr_3,
|
||||
insert_4ub_4f_abgr_4 },
|
||||
4 * sizeof(uint8_t) },
|
||||
4 * sizeof(uint8_t), FALSE },
|
||||
|
||||
{ "1f_const",
|
||||
{ insert_1f_1, insert_1f_1, insert_1f_1, insert_1f_1 },
|
||||
sizeof(float), TRUE },
|
||||
|
||||
{ "2f_const",
|
||||
{ insert_2f_1, insert_2f_2, insert_2f_2, insert_2f_2 },
|
||||
2 * sizeof(float), TRUE },
|
||||
|
||||
{ "3f_const",
|
||||
{ insert_3f_1, insert_3f_2, insert_3f_3, insert_3f_3 },
|
||||
3 * sizeof(float), TRUE },
|
||||
|
||||
{ "4f_const",
|
||||
{ insert_4f_1, insert_4f_2, insert_4f_3, insert_4f_4 },
|
||||
4 * sizeof(float), TRUE },
|
||||
|
||||
{ "pad",
|
||||
{ NULL, NULL, NULL, NULL },
|
||||
0 }
|
||||
0, FALSE },
|
||||
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -388,18 +388,21 @@ static boolean build_vertex_emit( struct x86_program *p )
|
|||
*/
|
||||
switch (a->format) {
|
||||
case DRAW_EMIT_1F:
|
||||
case DRAW_EMIT_1F_CONST:
|
||||
get_src_ptr(p, srcECX, vfESI, a);
|
||||
emit_load(p, temp, 1, x86_deref(srcECX), a->inputsize);
|
||||
emit_store(p, dest, 1, temp);
|
||||
update_src_ptr(p, srcECX, vfESI, a);
|
||||
break;
|
||||
case DRAW_EMIT_2F:
|
||||
case DRAW_EMIT_2F_CONST:
|
||||
get_src_ptr(p, srcECX, vfESI, a);
|
||||
emit_load(p, temp, 2, x86_deref(srcECX), a->inputsize);
|
||||
emit_store(p, dest, 2, temp);
|
||||
update_src_ptr(p, srcECX, vfESI, a);
|
||||
break;
|
||||
case DRAW_EMIT_3F:
|
||||
case DRAW_EMIT_3F_CONST:
|
||||
/* Potentially the worst case - hardcode 2+1 copying:
|
||||
*/
|
||||
if (0) {
|
||||
|
|
@ -423,6 +426,7 @@ static boolean build_vertex_emit( struct x86_program *p )
|
|||
}
|
||||
break;
|
||||
case DRAW_EMIT_4F:
|
||||
case DRAW_EMIT_4F_CONST:
|
||||
get_src_ptr(p, srcECX, vfESI, a);
|
||||
emit_load(p, temp, 4, x86_deref(srcECX), a->inputsize);
|
||||
emit_store(p, dest, 4, temp);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue