summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r300/r300_state_derived.c
diff options
context:
space:
mode:
authorMarek Olšák <maraeo@gmail.com>2009-11-26 19:37:58 +0100
committerCorbin Simpson <MostAwesomeDude@gmail.com>2009-12-01 01:20:26 -0800
commitcb90235135ef7c657053657f3bdfbda7ca70d708 (patch)
treea4e802bdecfb06fe8a742d77a3779276a7b6937f /src/gallium/drivers/r300/r300_state_derived.c
parent6f05eba0204a9f1371bb1ae5cdb0f71bb819eb28 (diff)
r300g: clean up derived states
The state setups which aren't derived anymore have been moved to the VS and FS objects.
Diffstat (limited to 'src/gallium/drivers/r300/r300_state_derived.c')
-rw-r--r--src/gallium/drivers/r300/r300_state_derived.c235
1 files changed, 16 insertions, 219 deletions
diff --git a/src/gallium/drivers/r300/r300_state_derived.c b/src/gallium/drivers/r300/r300_state_derived.c
index 03cdba0538..cd969d633b 100644
--- a/src/gallium/drivers/r300/r300_state_derived.c
+++ b/src/gallium/drivers/r300/r300_state_derived.c
@@ -29,6 +29,7 @@
#include "r300_context.h"
#include "r300_fs.h"
#include "r300_screen.h"
+#include "r300_shader_semantics.h"
#include "r300_state_derived.h"
#include "r300_state_inlines.h"
#include "r300_vs.h"
@@ -36,25 +37,6 @@
/* r300_state_derived: Various bits of state which are dependent upon
* currently bound CSO data. */
-#define ATTR_UNUSED (-1)
-#define ATTR_COLOR_COUNT 2
-#define ATTR_GENERIC_COUNT 16
-
-/* This structure contains information about what attributes are written by VS
- * or read by FS. (but not both) It's much easier to work with than
- * tgsi_shader_info.
- *
- * The variables basically means used/unused and may optionally contain
- * indices to tgsi_shader_info semantics which we need to know for Draw. */
-struct r300_shader_info {
- int pos;
- int psize;
- int color[ATTR_COLOR_COUNT];
- int bcolor[ATTR_COLOR_COUNT];
- int generic[ATTR_GENERIC_COUNT];
- int fog;
-};
-
struct r300_shader_key {
struct r300_vertex_shader* vs;
struct r300_fragment_shader* fs;
@@ -89,193 +71,21 @@ static void r300_draw_emit_attrib(struct r300_context* r300,
struct tgsi_shader_info* info = &r300->vs->info;
int output;
- if (r300->draw) {
- output = draw_find_vs_output(r300->draw,
- info->output_semantic_name[index],
- info->output_semantic_index[index]);
- draw_emit_vertex_attr(&r300->vertex_info->vinfo, emit, interp, output);
- }
+ output = draw_find_vs_output(r300->draw,
+ info->output_semantic_name[index],
+ info->output_semantic_index[index]);
+ draw_emit_vertex_attr(&r300->vertex_info->vinfo, emit, interp, output);
}
-static void r300_shader_info_reset(struct r300_shader_info* info)
+static void r300_draw_emit_all_attribs(struct r300_context* r300)
{
- int i;
-
- info->pos = ATTR_UNUSED;
- info->psize = ATTR_UNUSED;
- info->fog = ATTR_UNUSED;
-
- for (i = 0; i < ATTR_COLOR_COUNT; i++) {
- info->color[i] = ATTR_UNUSED;
- info->bcolor[i] = ATTR_UNUSED;
- }
-
- for (i = 0; i < ATTR_GENERIC_COUNT; i++) {
- info->generic[i] = ATTR_UNUSED;
- }
-}
-
-/* Convert info about VS output semantics to r300_shader_info. */
-static void r300_shader_read_vs_outputs(struct tgsi_shader_info* info,
- struct r300_shader_info* vs_outputs)
-{
- int i;
- unsigned index;
-
- r300_shader_info_reset(vs_outputs);
-
- for (i = 0; i < info->num_outputs; i++) {
- index = info->output_semantic_index[i];
-
- switch (info->output_semantic_name[i]) {
- case TGSI_SEMANTIC_POSITION:
- assert(index == 0);
- vs_outputs->pos = i;
- break;
-
- case TGSI_SEMANTIC_PSIZE:
- assert(index == 0);
- vs_outputs->psize = i;
- break;
-
- case TGSI_SEMANTIC_COLOR:
- assert(index <= ATTR_COLOR_COUNT);
- vs_outputs->color[index] = i;
- break;
-
- case TGSI_SEMANTIC_BCOLOR:
- assert(index <= ATTR_COLOR_COUNT);
- vs_outputs->bcolor[index] = i;
- break;
-
- case TGSI_SEMANTIC_GENERIC:
- assert(index <= ATTR_GENERIC_COUNT);
- vs_outputs->generic[index] = i;
- break;
-
- case TGSI_SEMANTIC_FOG:
- assert(index == 0);
- vs_outputs->fog = i;
- break;
-
- default:
- assert(0);
- }
- }
-}
-
-/* Set VS output stream locations for SWTCL. */
-static void r300_stream_locations_swtcl(struct r300_shader_info* vs_outputs,
- int* vs_output_tab)
-{
- int i, tabi = 0, gen_count;
-
- /* XXX Check whether the numbers (0, 1, 2+i, etc.) are correct.
- * These should go to VAP_PROG_STREAM_CNTL/DST_VEC_LOC. */
-
- /* Position. */
- vs_output_tab[tabi++] = 0;
-
- /* Point size. */
- if (vs_outputs->psize != ATTR_UNUSED) {
- vs_output_tab[tabi++] = 1;
- }
-
- /* Colors. */
- for (i = 0; i < ATTR_COLOR_COUNT; i++) {
- if (vs_outputs->color[i] != ATTR_UNUSED) {
- vs_output_tab[tabi++] = 2 + i;
- }
- }
-
- /* Back-face colors. */
- for (i = 0; i < ATTR_COLOR_COUNT; i++) {
- if (vs_outputs->bcolor[i] != ATTR_UNUSED) {
- vs_output_tab[tabi++] = 4 + i;
- }
- }
-
- /* Texture coordinates. */
- gen_count = 0;
- for (i = 0; i < ATTR_GENERIC_COUNT; i++) {
- if (vs_outputs->bcolor[i] != ATTR_UNUSED) {
- assert(tabi < 16);
- vs_output_tab[tabi++] = 6 + gen_count;
- gen_count++;
- }
- }
-
- /* Fog coordinates. */
- if (vs_outputs->fog != ATTR_UNUSED) {
- assert(tabi < 16);
- vs_output_tab[tabi++] = 6 + gen_count;
- gen_count++;
- }
-
- /* XXX magic */
- assert(gen_count <= 8);
-
- for (; tabi < 16;) {
- vs_output_tab[tabi++] = -1;
- }
-}
-
-/* Convert info about FS input semantics to r300_shader_info. */
-static void r300_shader_read_fs_inputs(struct tgsi_shader_info* info,
- struct r300_shader_info* fs_inputs)
-{
- int i;
- unsigned index;
-
- r300_shader_info_reset(fs_inputs);
-
- for (i = 0; i < info->num_inputs; i++) {
- index = info->input_semantic_index[i];
-
- switch (info->input_semantic_name[i]) {
- case TGSI_SEMANTIC_COLOR:
- assert(index <= ATTR_COLOR_COUNT);
- fs_inputs->color[index] = i;
- break;
-
- case TGSI_SEMANTIC_GENERIC:
- assert(index <= ATTR_GENERIC_COUNT);
- fs_inputs->generic[index] = i;
- break;
-
- case TGSI_SEMANTIC_FOG:
- assert(index == 0);
- fs_inputs->fog = i;
- break;
-
- default:
- assert(0);
- }
- }
-}
-
-static void r300_update_vap_output_fmt(struct r300_context* r300,
- struct r300_shader_info* vs_outputs)
-{
- struct vertex_info* vinfo = &r300->vertex_info->vinfo;
+ struct r300_shader_semantics* vs_outputs = &r300->vs->outputs;
int i, gen_count;
- /* Do the actual vertex_info setup.
- *
- * vertex_info has four uints of hardware-specific data in it.
- * vinfo.hwfmt[0] is R300_VAP_VTX_STATE_CNTL
- * vinfo.hwfmt[1] is R300_VAP_VSM_VTX_ASSM
- * vinfo.hwfmt[2] is R300_VAP_OUTPUT_VTX_FMT_0
- * vinfo.hwfmt[3] is R300_VAP_OUTPUT_VTX_FMT_1 */
-
- vinfo->hwfmt[0] = 0x5555; /* XXX this is classic Mesa bonghits */
-
/* Position. */
if (vs_outputs->pos != ATTR_UNUSED) {
r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE,
vs_outputs->pos);
- vinfo->hwfmt[1] |= R300_INPUT_CNTL_POS;
- vinfo->hwfmt[2] |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT;
} else {
assert(0);
}
@@ -284,7 +94,6 @@ static void r300_update_vap_output_fmt(struct r300_context* r300,
if (vs_outputs->psize != ATTR_UNUSED) {
r300_draw_emit_attrib(r300, EMIT_1F_PSIZE, INTERP_POS,
vs_outputs->psize);
- vinfo->hwfmt[2] |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT;
}
/* Colors. */
@@ -292,8 +101,6 @@ static void r300_update_vap_output_fmt(struct r300_context* r300,
if (vs_outputs->color[i] != ATTR_UNUSED) {
r300_draw_emit_attrib(r300, EMIT_4F, INTERP_LINEAR,
vs_outputs->color[i]);
- vinfo->hwfmt[1] |= R300_INPUT_CNTL_COLOR;
- vinfo->hwfmt[2] |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT << i;
}
}
@@ -305,8 +112,6 @@ static void r300_update_vap_output_fmt(struct r300_context* r300,
if (vs_outputs->generic[i] != ATTR_UNUSED) {
r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE,
vs_outputs->generic[i]);
- vinfo->hwfmt[1] |= (R300_INPUT_CNTL_TC0 << gen_count);
- vinfo->hwfmt[3] |= (4 << (3 * gen_count));
gen_count++;
}
}
@@ -315,15 +120,11 @@ static void r300_update_vap_output_fmt(struct r300_context* r300,
if (vs_outputs->fog != ATTR_UNUSED) {
r300_draw_emit_attrib(r300, EMIT_4F, INTERP_PERSPECTIVE,
vs_outputs->fog);
- vinfo->hwfmt[1] |= (R300_INPUT_CNTL_TC0 << gen_count);
- vinfo->hwfmt[3] |= (4 << (3 * gen_count));
gen_count++;
}
/* XXX magic */
assert(gen_count <= 8);
-
- draw_compute_vertex_size(vinfo);
}
/* Update the PSC tables. */
@@ -370,14 +171,14 @@ static void r300_vertex_psc(struct r300_context* r300)
}
/* Update the PSC tables for SW TCL, using Draw. */
-static void r300_swtcl_vertex_psc(struct r300_context* r300,
- int* vs_output_tab)
+static void r300_swtcl_vertex_psc(struct r300_context* r300)
{
struct r300_vertex_info *vformat = r300->vertex_info;
struct vertex_info* vinfo = &vformat->vinfo;
uint16_t type, swizzle;
enum pipe_format format;
unsigned i, attrib_count;
+ int* vs_output_tab = r300->vs->output_stream_loc_swtcl;
/* For each Draw attribute, route it to the fragment shader according
* to the vs_output_tab. */
@@ -514,8 +315,8 @@ static void r500_rs_tex_write(struct r300_rs_block* rs, int id, int fp_offset)
* of vertices into fragments. This is also the part of the chipset that
* locks up if any part of it is even slightly wrong. */
static void r300_update_rs_block(struct r300_context* r300,
- struct r300_shader_info* vs_outputs,
- struct r300_shader_info* fs_inputs)
+ struct r300_shader_semantics* vs_outputs,
+ struct r300_shader_semantics* fs_inputs)
{
struct r300_rs_block* rs = r300->rs_block;
int i, col_count = 0, tex_count = 0, fp_offset = 0;
@@ -616,8 +417,6 @@ static void r300_update_rs_block(struct r300_context* r300,
static void r300_update_derived_shader_state(struct r300_context* r300)
{
struct r300_screen* r300screen = r300_screen(r300->context.screen);
- struct r300_shader_info vs_outputs, fs_inputs;
- int vs_output_tab[16];
/*
struct r300_shader_key* key;
@@ -648,18 +447,16 @@ static void r300_update_derived_shader_state(struct r300_context* r300)
/* Reset structures */
memset(r300->rs_block, 0, sizeof(struct r300_rs_block));
memset(r300->vertex_info, 0, sizeof(struct r300_vertex_info));
+ memcpy(r300->vertex_info->vinfo.hwfmt, r300->vs->hwfmt, sizeof(uint)*4);
- r300_shader_read_vs_outputs(&r300->vs->info, &vs_outputs);
- r300_shader_read_fs_inputs(&r300->fs->info, &fs_inputs);
-
- r300_update_vap_output_fmt(r300, &vs_outputs);
- r300_update_rs_block(r300, &vs_outputs, &fs_inputs);
+ r300_update_rs_block(r300, &r300->vs->outputs, &r300->fs->inputs);
if (r300screen->caps->has_tcl) {
r300_vertex_psc(r300);
} else {
- r300_stream_locations_swtcl(&vs_outputs, vs_output_tab);
- r300_swtcl_vertex_psc(r300, vs_output_tab);
+ r300_draw_emit_all_attribs(r300);
+ draw_compute_vertex_size(&r300->vertex_info->vinfo);
+ r300_swtcl_vertex_psc(r300);
}
r300->dirty_state |= R300_NEW_RS_BLOCK;