diff options
| author | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-02-13 23:20:43 -0800 | 
|---|---|---|
| committer | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-02-13 23:22:39 -0800 | 
| commit | e511110b71a7ea19c531d707080813d9d432341c (patch) | |
| tree | 20ea8722fe1323863d47967e0aa3d2e8f7c321fe /src | |
| parent | c51c822ee02cb47ddba46da668577d51b7c02831 (diff) | |
r300-gallium: Add derived state for vertex formats.
Next up: The evil RS block.
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/drivers/r300/Makefile | 1 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 26 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_derived.c | 114 | ||||
| -rw-r--r-- | src/gallium/drivers/r300/r300_state_derived.h | 31 | 
4 files changed, 161 insertions, 11 deletions
| diff --git a/src/gallium/drivers/r300/Makefile b/src/gallium/drivers/r300/Makefile index e83d943cd8..85b3f15ac5 100644 --- a/src/gallium/drivers/r300/Makefile +++ b/src/gallium/drivers/r300/Makefile @@ -11,6 +11,7 @@ C_SOURCES = \  	r300_flush.c \  	r300_screen.c \  	r300_state.c \ +	r300_state_derived.c \  	r300_state_shader.c \  	r300_surface.c \  	r300_swtcl_emit.c \ diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index 54879f88f5..caedbb8448 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -24,6 +24,7 @@  #define R300_CONTEXT_H  #include "draw/draw_context.h" +#include "draw/draw_vertex.h"  #include "pipe/p_context.h"  #include "tgsi/tgsi_scan.h"  #include "util/u_memory.h" @@ -85,17 +86,18 @@ struct r300_scissor_state {  struct r300_texture_state {  }; -#define R300_NEW_BLEND           0x000001 -#define R300_NEW_BLEND_COLOR     0x000002 -#define R300_NEW_DSA             0x000004 -#define R300_NEW_FRAMEBUFFERS    0x000008 -#define R300_NEW_FRAGMENT_SHADER 0x000010 -#define R300_NEW_RASTERIZER      0x000020 -#define R300_NEW_SAMPLER         0x000040 -#define R300_NEW_SCISSOR         0x004000 -#define R300_NEW_TEXTURE         0x008000 -#define R300_NEW_VERTEX_SHADER   0x800000 -#define R300_NEW_KITCHEN_SINK    0xffffff +#define R300_NEW_BLEND           0x0000001 +#define R300_NEW_BLEND_COLOR     0x0000002 +#define R300_NEW_DSA             0x0000004 +#define R300_NEW_FRAMEBUFFERS    0x0000008 +#define R300_NEW_FRAGMENT_SHADER 0x0000010 +#define R300_NEW_RASTERIZER      0x0000020 +#define R300_NEW_SAMPLER         0x0000040 +#define R300_NEW_SCISSOR         0x0004000 +#define R300_NEW_TEXTURE         0x0008000 +#define R300_NEW_VERTEX_FORMAT   0x0800000 +#define R300_NEW_VERTEX_SHADER   0x1000000 +#define R300_NEW_KITCHEN_SINK    0x1ffffff  /* The next several objects are not pure Radeon state; they inherit from   * various Gallium classes. */ @@ -203,6 +205,8 @@ struct r300_context {      struct r300_texture* textures[8];      struct r300_texture_state* texture_states[8];      int texture_count; +    /* Vertex information. */ +    struct vertex_info vertex_info;      /* Bitmask of dirty state objects. */      uint32_t dirty_state;      /* Flag indicating whether or not the HW is dirty. */ diff --git a/src/gallium/drivers/r300/r300_state_derived.c b/src/gallium/drivers/r300/r300_state_derived.c new file mode 100644 index 0000000000..fc2730d4c6 --- /dev/null +++ b/src/gallium/drivers/r300/r300_state_derived.c @@ -0,0 +1,114 @@ +/* + * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#include "r300_state_derived.h" + +/* r300_state_derived: Various bits of state which are dependent upon + * currently bound CSO data. */ + +/* Update the vertex_info struct in our r300_context. + * + * The vertex_info struct describes the post-TCL format of vertices. It is + * required for Draw when doing SW TCL, and also for describing the + * dreaded RS block on R300 chipsets. */ +/* XXX this function should be able to handle vert shaders as well as draw */ +static void r300_update_vertex_layout(struct r300_context* r300) +{ +    struct vertex_info vinfo; +    boolean pos = false, psize = false, fog = false; +    int i, texs = 0, cols = 0; + +    struct tgsi_shader_info* info = &r300->fs->info; +    memset(&vinfo, 0, sizeof(vinfo)); + +    /* This is rather lame. Since draw_find_vs_output doesn't return an error +     * when it can't find an output, we have to pre-iterate and count each +     * output ourselves. */ +    for (i = 0; i < info->num_inputs; i++) { +        switch (info->input_semantic_name[i]) { +            case TGSI_SEMANTIC_POSITION: +                pos = true; +                break; +            case TGSI_SEMANTIC_COLOR: +                cols++; +                break; +            case TGSI_SEMANTIC_FOG: +                fog = true; +                break; +            case TGSI_SEMANTIC_PSIZE: +                psize = true; +                break; +            case TGSI_SEMANTIC_GENERIC: +                texs++; +                break; +            default: +                debug_printf("r300: Unknown vertex input %d\n", +                    info->input_semantic_name[i]); +                break; +        } +    } + +    /* Do the actual vertex_info setup. +     * +     * vertex_info has four uints of hardware-specific data in it. +     * vinfo.hwfmt[0] is VAP_OUT_VTX_FMT_0 +     * vinfo.hwfmt[1] is VAP_OUT_VTX_FMT_1 */ + +    if (pos) { +        draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_POS, +            draw_find_vs_output(r300->draw, TGSI_SEMANTIC_POSITION, 0)); +        vinfo.hwfmt[0] |= R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT; +    } else { +        debug_printf("r300: No vertex input for position in SW TCL;\n" +            "    this will probably end poorly.\n"); +    } + +    if (psize) { +        draw_emit_vertex_attr(&vinfo, EMIT_1F, INTERP_LINEAR, +            draw_find_vs_output(r300->draw, TGSI_SEMANTIC_PSIZE, 0)); +        vinfo.hwfmt[0] |= R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT; +    } + +    for (i = 0; i < cols; i++) { +        draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_LINEAR, +            draw_find_vs_output(r300->draw, TGSI_SEMANTIC_COLOR, i)); +        vinfo.hwfmt[0] |= (R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT << i); +    } + +    if (fog) { +        draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_PERSPECTIVE, +            draw_find_vs_output(r300->draw, TGSI_SEMANTIC_FOG, 0)); +        vinfo.hwfmt[0] |= +            (R300_VAP_OUTPUT_VTX_FMT_0__COLOR_0_PRESENT << cols); +    } + +    for (i = 0; i < texs; i++) { +        draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_LINEAR, +            draw_find_vs_output(r300->draw, TGSI_SEMANTIC_GENERIC, i)); +        vinfo.hwfmt[1] |= (4 << (3 * i)); +    } + +    if (memcmp(&r300->vertex_info, &vinfo, sizeof(struct vertex_info))) { +        memcpy(&r300->vertex_info, &vinfo, sizeof(struct vertex_info)); +        r300->dirty_state |= R300_NEW_VERTEX_FORMAT; +    } +} diff --git a/src/gallium/drivers/r300/r300_state_derived.h b/src/gallium/drivers/r300/r300_state_derived.h new file mode 100644 index 0000000000..11d0787d12 --- /dev/null +++ b/src/gallium/drivers/r300/r300_state_derived.h @@ -0,0 +1,31 @@ +/* + * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifndef R300_STATE_DERIVED_H +#define R300_STATE_DERIVED_H + +#include "draw/draw_vertex.h" + +#include "r300_context.h" +#include "r300_reg.h" + +#endif /* R300_STATE_DERIVED_H */ | 
