r300: Add shader state stubs.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Thu, 5 Feb 2009 00:07:39 +0000 (16:07 -0800)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Thu, 5 Feb 2009 00:07:39 +0000 (16:07 -0800)
src/gallium/drivers/r300/Makefile
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r300/r300_state_shader.c [new file with mode: 0644]
src/gallium/drivers/r300/r300_state_shader.h [new file with mode: 0644]

index 8906d1227a9025181f620d8e03a15a4b2f9f7e81..e83d943cd84f6f0bda36a651ccdf4c5004ad232c 100644 (file)
@@ -11,6 +11,7 @@ C_SOURCES = \
        r300_flush.c \
        r300_screen.c \
        r300_state.c \
+       r300_state_shader.c \
        r300_surface.c \
        r300_swtcl_emit.c \
        r300_texture.c
index e0aad660184a9684b854e2830fff09bbf6d9f6fb..fb91c172f47774e88615fd2c212e27467fcecd6a 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "draw/draw_context.h"
 #include "pipe/p_context.h"
+#include "tgsi/tgsi_scan.h"
 #include "util/u_memory.h"
 
 #include "r300_clear.h"
@@ -56,9 +57,6 @@ struct r300_dsa_state {
     uint32_t stencil_ref_bf;    /* R500_ZB_STENCILREFMASK_BF: 0x4fd4 */
 };
 
-struct r300_fs_state {
-};
-
 struct r300_rs_state {
     uint32_t vap_control_status;    /* R300_VAP_CNTL_STATUS: 0x2140 */
     uint32_t point_size;            /* R300_GA_POINT_SIZE: 0x421c */
@@ -99,6 +97,28 @@ struct r300_texture_state {
 #define R300_NEW_VERTEX_SHADER   0x800000
 #define R300_NEW_KITCHEN_SINK    0xffffff
 
+/* The next several objects are not pure Radeon state; they inherit from
+ * various Gallium classes. */
+
+struct r3xx_fragment_shader {
+    /* Parent class */
+    struct pipe_shader_state state;
+    struct tgsi_shader_info info;
+
+    /* Has this shader been translated yet? */
+    boolean translated;
+};
+
+struct r300_fragment_shader {
+    /* Parent class */
+    struct r3xx_fragment_shader shader;
+};
+
+struct r500_fragment_shader {
+    /* Parent class */
+    struct r3xx_fragment_shader shader;
+};
+
 struct r300_texture {
     /* Parent class */
     struct pipe_texture tex;
@@ -129,8 +149,8 @@ struct r300_context {
     struct r300_blend_color_state* blend_color_state;
     /* Depth, stencil, and alpha state. */
     struct r300_dsa_state* dsa_state;
-    /* Fragment shader state. */
-    struct r300_fs_state* fs_state;
+    /* Fragment shader. */
+    struct r3xx_fragment_shader* fs;
     /* Framebuffer state. We currently don't need our own version of this. */
     struct pipe_framebuffer_state framebuffer_state;
     /* Rasterizer state. */
index b4b50ce1a9ca19299ffc4c446c091b5949d8e9f5..9392d7234279ab4a2760d6fdaefd9c1ea115f18e 100644 (file)
@@ -399,27 +399,48 @@ static void
 
 /* Create fragment shader state. */
 static void* r300_create_fs_state(struct pipe_context* pipe,
-                                  const struct pipe_shader_state* state)
+                                  const struct pipe_shader_state* shader)
 {
-    struct r300_fs_state* fs = CALLOC_STRUCT(r300_fs_state);
+    struct r300_context* r300 = r300_context(pipe);
+    struct r3xx_fragment_shader* fs = NULL;
+
+    if (r300_screen(r300->context.screen)->caps->is_r500) {
+        fs =
+            (struct r3xx_fragment_shader*)CALLOC_STRUCT(r500_fragment_shader);
+    } else {
+        fs =
+            (struct r3xx_fragment_shader*)CALLOC_STRUCT(r300_fragment_shader);
+    }
+
+    /* Copy state directly into shader. */
+    fs->state = *shader;
 
     return (void*)fs;
 }
 
 /* Bind fragment shader state. */
-static void r300_bind_fs_state(struct pipe_context* pipe, void* state)
+static void r300_bind_fs_state(struct pipe_context* pipe, void* shader)
 {
     struct r300_context* r300 = r300_context(pipe);
+    struct r3xx_fragment_shader* fs = (struct r3xx_fragment_shader*)shader;
 
-    r300->fs_state = (struct r300_fs_state*)state;
+    if (!fs->translated) {
+        if (r300_screen(r300->context.screen)->caps->is_r500) {
+            r500_translate_shader(r300, fs);
+        } else {
+            r300_translate_shader(r300, fs);
+        }
+    }
+
+    r300->fs = fs;
 
     r300->dirty_state |= R300_NEW_FRAGMENT_SHADER;
 }
 
-/* Delect fragment shader state. */
-static void r300_delete_fs_state(struct pipe_context* pipe, void* state)
+/* Delete fragment shader state. */
+static void r300_delete_fs_state(struct pipe_context* pipe, void* shader)
 {
-    FREE(state);
+    FREE(shader);
 }
 
 static void r300_set_polygon_stipple(struct pipe_context* pipe,
diff --git a/src/gallium/drivers/r300/r300_state_shader.c b/src/gallium/drivers/r300/r300_state_shader.c
new file mode 100644 (file)
index 0000000..e871721
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * 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_shader.h"
+
+void r300_translate_shader(struct r300_context* r300,
+                           struct r300_fragment_shader* fs)
+{
+}
+
+void r500_translate_shader(struct r300_context* r300,
+                           struct r500_fragment_shader* fs)
+{
+}
diff --git a/src/gallium/drivers/r300/r300_state_shader.h b/src/gallium/drivers/r300/r300_state_shader.h
new file mode 100644 (file)
index 0000000..a20bd42
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * 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_SHADER_H
+#define R300_STATE_SHADER_H
+
+#include "r300_context.h"
+#include "r300_screen.h"
+
+void r300_translate_shader(struct r300_context* r300,
+                           struct r300_fragment_shader* fs);
+
+void r500_translate_shader(struct r300_context* r300,
+                           struct r500_fragment_shader* fs);
+
+#endif /* R300_STATE_SHADER_H */