struct const_decl const_decls;
struct const_decl const_decls2D[PIPE_MAX_CONSTANT_BUFFERS];
- unsigned property_gs_input_prim;
- unsigned property_gs_output_prim;
- unsigned property_gs_max_vertices;
- unsigned property_gs_invocations;
- unsigned char property_fs_coord_origin; /* = TGSI_FS_COORD_ORIGIN_* */
- unsigned char property_fs_coord_pixel_center; /* = TGSI_FS_COORD_PIXEL_CENTER_* */
- unsigned char property_fs_color0_writes_all_cbufs; /* = TGSI_FS_COLOR0_WRITES_ALL_CBUFS * */
- unsigned char property_fs_depth_layout; /* TGSI_FS_DEPTH_LAYOUT */
- boolean property_vs_window_space_position; /* TGSI_VS_WINDOW_SPACE_POSITION */
+ unsigned properties[TGSI_PROPERTY_COUNT];
unsigned nr_addrs;
unsigned nr_preds;
void
-ureg_property_gs_input_prim(struct ureg_program *ureg,
- unsigned input_prim)
+ureg_property(struct ureg_program *ureg, unsigned name, unsigned value)
{
- ureg->property_gs_input_prim = input_prim;
-}
-
-void
-ureg_property_gs_output_prim(struct ureg_program *ureg,
- unsigned output_prim)
-{
- ureg->property_gs_output_prim = output_prim;
-}
-
-void
-ureg_property_gs_max_vertices(struct ureg_program *ureg,
- unsigned max_vertices)
-{
- ureg->property_gs_max_vertices = max_vertices;
-}
-void
-ureg_property_gs_invocations(struct ureg_program *ureg,
- unsigned invocations)
-{
- ureg->property_gs_invocations = invocations;
-}
-
-void
-ureg_property_fs_coord_origin(struct ureg_program *ureg,
- unsigned fs_coord_origin)
-{
- ureg->property_fs_coord_origin = fs_coord_origin;
-}
-
-void
-ureg_property_fs_coord_pixel_center(struct ureg_program *ureg,
- unsigned fs_coord_pixel_center)
-{
- ureg->property_fs_coord_pixel_center = fs_coord_pixel_center;
-}
-
-void
-ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
- unsigned fs_color0_writes_all_cbufs)
-{
- ureg->property_fs_color0_writes_all_cbufs = fs_color0_writes_all_cbufs;
-}
-
-void
-ureg_property_fs_depth_layout(struct ureg_program *ureg,
- unsigned fs_depth_layout)
-{
- ureg->property_fs_depth_layout = fs_depth_layout;
-}
-
-void
-ureg_property_vs_window_space_position(struct ureg_program *ureg,
- boolean vs_window_space_position)
-{
- ureg->property_vs_window_space_position = vs_window_space_position;
+ assert(name < Elements(ureg->properties));
+ ureg->properties[name] = value;
}
struct ureg_src
{
unsigned i;
- if (ureg->property_gs_input_prim != ~0) {
- assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
-
- emit_property(ureg,
- TGSI_PROPERTY_GS_INPUT_PRIM,
- ureg->property_gs_input_prim);
- }
-
- if (ureg->property_gs_output_prim != ~0) {
- assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
-
- emit_property(ureg,
- TGSI_PROPERTY_GS_OUTPUT_PRIM,
- ureg->property_gs_output_prim);
- }
-
- if (ureg->property_gs_max_vertices != ~0) {
- assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
-
- emit_property(ureg,
- TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES,
- ureg->property_gs_max_vertices);
- }
-
- if (ureg->property_gs_invocations != ~0) {
- assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY);
-
- emit_property(ureg,
- TGSI_PROPERTY_GS_INVOCATIONS,
- ureg->property_gs_invocations);
- }
-
- if (ureg->property_fs_coord_origin) {
- assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
-
- emit_property(ureg,
- TGSI_PROPERTY_FS_COORD_ORIGIN,
- ureg->property_fs_coord_origin);
- }
-
- if (ureg->property_fs_coord_pixel_center) {
- assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
-
- emit_property(ureg,
- TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
- ureg->property_fs_coord_pixel_center);
- }
-
- if (ureg->property_fs_color0_writes_all_cbufs) {
- assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
-
- emit_property(ureg,
- TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS,
- ureg->property_fs_color0_writes_all_cbufs);
- }
-
- if (ureg->property_fs_depth_layout) {
- assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT);
-
- emit_property(ureg,
- TGSI_PROPERTY_FS_DEPTH_LAYOUT,
- ureg->property_fs_depth_layout);
- }
-
- if (ureg->property_vs_window_space_position) {
- assert(ureg->processor == TGSI_PROCESSOR_VERTEX);
-
- emit_property(ureg,
- TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION,
- ureg->property_vs_window_space_position);
- }
+ for (i = 0; i < Elements(ureg->properties); i++)
+ if (ureg->properties[i] != ~0)
+ emit_property(ureg, i, ureg->properties[i]);
if (ureg->processor == TGSI_PROCESSOR_VERTEX) {
for (i = 0; i < UREG_MAX_INPUT; i++) {
struct ureg_program *ureg_create( unsigned processor )
{
+ int i;
struct ureg_program *ureg = CALLOC_STRUCT( ureg_program );
if (ureg == NULL)
goto no_ureg;
ureg->processor = processor;
- ureg->property_gs_input_prim = ~0;
- ureg->property_gs_output_prim = ~0;
- ureg->property_gs_max_vertices = ~0;
- ureg->property_gs_invocations = ~0;
+
+ for (i = 0; i < Elements(ureg->properties); i++)
+ ureg->properties[i] = ~0;
ureg->free_temps = util_bitmask_create();
if (ureg->free_temps == NULL)
*/
void
-ureg_property_gs_input_prim(struct ureg_program *ureg,
- unsigned input_prim);
-
-void
-ureg_property_gs_output_prim(struct ureg_program *ureg,
- unsigned output_prim);
-
-void
-ureg_property_gs_max_vertices(struct ureg_program *ureg,
- unsigned max_vertices);
-
-void
-ureg_property_gs_invocations(struct ureg_program *ureg,
- unsigned invocations);
-
-void
-ureg_property_fs_coord_origin(struct ureg_program *ureg,
- unsigned fs_coord_origin);
-
-void
-ureg_property_fs_coord_pixel_center(struct ureg_program *ureg,
- unsigned fs_coord_pixel_center);
-
-void
-ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg,
- unsigned fs_color0_writes_all_cbufs);
-
-void
-ureg_property_fs_depth_layout(struct ureg_program *ureg,
- unsigned fs_depth_layout);
-
-void
-ureg_property_vs_window_space_position(struct ureg_program *ureg,
- boolean vs_window_space_position);
+ureg_property(struct ureg_program *ureg, unsigned name, unsigned value);
/***********************************************************************
return NULL;
if (window_space)
- ureg_property_vs_window_space_position(ureg, TRUE);
+ ureg_property(ureg, TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION, TRUE);
for (i = 0; i < num_attribs; i++) {
struct ureg_src src;
}
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) {
/* the driver supports lower-left origin, need to invert Y */
- ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
+ TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
invert = TRUE;
}
else
/* Fragment shader wants origin in lower-left */
if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT))
/* the driver supports lower-left origin */
- ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
+ TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT))
/* the driver supports upper-left origin, need to invert Y */
invert = TRUE;
if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
/* the driver supports pixel center integer */
adjY[1] = 1.0f;
- ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
+ TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
}
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) {
/* the driver supports pixel center half integer, need to bias X,Y */
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
/* the driver supports pixel center integer, need to bias X,Y */
adjX = adjY[0] = adjY[1] = 0.5f;
- ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
+ TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
}
else
assert(0);
}
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) {
/* the driver supports lower-left origin, need to invert Y */
- ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
+ TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
invert = TRUE;
}
else
/* Fragment shader wants origin in lower-left */
if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT))
/* the driver supports lower-left origin */
- ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN,
+ TGSI_FS_COORD_ORIGIN_LOWER_LEFT);
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT))
/* the driver supports upper-left origin, need to invert Y */
invert = TRUE;
if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
/* the driver supports pixel center integer */
adjY[1] = 1.0f;
- ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
+ TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
}
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) {
/* the driver supports pixel center half integer, need to bias X,Y */
else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) {
/* the driver supports pixel center integer, need to bias X,Y */
adjX = adjY[0] = adjY[1] = 0.5f;
- ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
+ TGSI_FS_COORD_PIXEL_CENTER_INTEGER);
}
else
assert(0);
debug_printf("\n");
}
if (write_all == GL_TRUE)
- ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
+ ureg_property(ureg, TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS, 1);
if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
switch (stfp->Base.FragDepthLayout) {
case FRAG_DEPTH_LAYOUT_ANY:
- ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
+ ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
+ TGSI_FS_DEPTH_LAYOUT_ANY);
break;
case FRAG_DEPTH_LAYOUT_GREATER:
- ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER);
+ ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
+ TGSI_FS_DEPTH_LAYOUT_GREATER);
break;
case FRAG_DEPTH_LAYOUT_LESS:
- ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
+ ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
+ TGSI_FS_DEPTH_LAYOUT_LESS);
break;
case FRAG_DEPTH_LAYOUT_UNCHANGED:
- ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
+ ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT,
+ TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
break;
default:
assert(0);
stgp->tgsi.tokens = NULL;
}
- ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
- ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
- ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
- ureg_property_gs_invocations(ureg, stgp->Base.Invocations);
+ ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM, stgp->Base.InputType);
+ ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM, stgp->Base.OutputType);
+ ureg_property(ureg, TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES,
+ stgp->Base.VerticesOut);
+ ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS, stgp->Base.Invocations);
if (stgp->glsl_to_tgsi)
st_translate_program(st->ctx,