Merge commit 'origin/gallium-master-merge'
[mesa.git] / src / gallium / drivers / i965simple / brw_state.c
index ac243b7e4f9b1963e56180b8d1e8e318b4da70c1..b47f5373f3cd8ecb1911e95e4b85917a6b36cd56 100644 (file)
-/**************************************************************************\r
- *\r
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.\r
- * All Rights Reserved.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the\r
- * "Software"), to deal in the Software without restriction, including\r
- * without limitation the rights to use, copy, modify, merge, publish,\r
- * distribute, sub license, and/or sell copies of the Software, and to\r
- * permit persons to whom the Software is furnished to do so, subject to\r
- * the following conditions:\r
- *\r
- * The above copyright notice and this permission notice (including the\r
- * next paragraph) shall be included in all copies or substantial portions\r
- * of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\r
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR\r
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- *\r
- **************************************************************************/\r
-\r
-/* Authors:  Zack Rusin <zack@tungstengraphics.com>\r
- *           Keith Whitwell <keith@tungstengraphics.com>\r
- */\r
-\r
-\r
-#include "pipe/p_winsys.h"\r
-#include "pipe/p_util.h"\r
-#include "pipe/p_inlines.h"\r
-#include "pipe/p_shader_tokens.h"\r
-#include "tgsi/util/tgsi_dump.h"\r
-#include "tgsi/util/tgsi_parse.h"\r
-\r
-#include "brw_context.h"\r
-#include "brw_defines.h"\r
-#include "brw_state.h"\r
-#include "brw_draw.h"\r
-\r
-\r
-#define DUP( TYPE, VAL )                        \\r
-do {                                            \\r
-   struct TYPE *x = malloc(sizeof(*x));         \\r
-   memcpy(x, VAL, sizeof(*x) );                 \\r
-   return x;                                    \\r
-} while (0)\r
-\r
-/************************************************************************\r
- * Blend \r
- */\r
-static void *\r
-brw_create_blend_state(struct pipe_context *pipe,\r
-                        const struct pipe_blend_state *blend)\r
-{   \r
-   DUP( pipe_blend_state, blend );\r
-}\r
-\r
-static void brw_bind_blend_state(struct pipe_context *pipe,\r
-                                 void *blend)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.Blend = (struct pipe_blend_state*)blend;\r
-   brw->state.dirty.brw |= BRW_NEW_BLEND;\r
-}\r
-\r
-\r
-static void brw_delete_blend_state(struct pipe_context *pipe, void *blend)\r
-{\r
-   free(blend);\r
-}\r
-\r
-static void brw_set_blend_color( struct pipe_context *pipe,\r
-                            const struct pipe_blend_color *blend_color )\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.BlendColor = *blend_color;\r
-\r
-   brw->state.dirty.brw |= BRW_NEW_BLEND;\r
-}\r
-\r
-/************************************************************************\r
- * Sampler \r
- */\r
-\r
-static void *\r
-brw_create_sampler_state(struct pipe_context *pipe,\r
-                          const struct pipe_sampler_state *sampler)\r
-{\r
-   DUP( pipe_sampler_state, sampler );\r
-}\r
-\r
-static void brw_bind_sampler_states(struct pipe_context *pipe,\r
-                                    unsigned num, void **sampler)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   assert(num <= PIPE_MAX_SAMPLERS);\r
-\r
-   /* Check for no-op */\r
-   if (num == brw->num_samplers &&\r
-       !memcmp(brw->attribs.Samplers, sampler, num * sizeof(void *)))\r
-      return;\r
-\r
-   memcpy(brw->attribs.Samplers, sampler, num * sizeof(void *));\r
-   memset(&brw->attribs.Samplers[num], 0, (PIPE_MAX_SAMPLERS - num) *\r
-          sizeof(void *));\r
-\r
-   brw->num_samplers = num;\r
-\r
-   brw->state.dirty.brw |= BRW_NEW_SAMPLER;\r
-}\r
-\r
-static void brw_delete_sampler_state(struct pipe_context *pipe,\r
-                                      void *sampler)\r
-{\r
-   free(sampler);\r
-}\r
-\r
-\r
-/************************************************************************\r
- * Depth stencil \r
- */\r
-\r
-static void *\r
-brw_create_depth_stencil_state(struct pipe_context *pipe,\r
-                           const struct pipe_depth_stencil_alpha_state *depth_stencil)\r
-{\r
-   DUP( pipe_depth_stencil_alpha_state, depth_stencil );\r
-}\r
-\r
-static void brw_bind_depth_stencil_state(struct pipe_context *pipe,\r
-                                         void *depth_stencil)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.DepthStencil = (const struct pipe_depth_stencil_alpha_state *)depth_stencil;\r
-\r
-   brw->state.dirty.brw |= BRW_NEW_DEPTH_STENCIL;\r
-}\r
-\r
-static void brw_delete_depth_stencil_state(struct pipe_context *pipe,\r
-                                           void *depth_stencil)\r
-{\r
-   free(depth_stencil);\r
-}\r
-\r
-/************************************************************************\r
- * Scissor\r
- */\r
-static void brw_set_scissor_state( struct pipe_context *pipe,\r
-                                 const struct pipe_scissor_state *scissor )\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   memcpy( &brw->attribs.Scissor, scissor, sizeof(*scissor) );\r
-   brw->state.dirty.brw |= BRW_NEW_SCISSOR;\r
-}\r
-\r
-\r
-/************************************************************************\r
- * Stipple\r
- */\r
-\r
-static void brw_set_polygon_stipple( struct pipe_context *pipe,\r
-                                   const struct pipe_poly_stipple *stipple )\r
-{\r
-}\r
-\r
-\r
-/************************************************************************\r
- * Fragment shader\r
- */\r
-\r
-static void * brw_create_fs_state(struct pipe_context *pipe,\r
-                                   const struct pipe_shader_state *shader)\r
-{\r
-   struct brw_fragment_program *brw_fp = CALLOC_STRUCT(brw_fragment_program);\r
-\r
-   brw_fp->program.tokens = tgsi_dup_tokens(shader->tokens);\r
-   brw_fp->id = brw_context(pipe)->program_id++;\r
-\r
-   tgsi_scan_shader(shader->tokens, &brw_fp->info);\r
-\r
-#if 0\r
-   brw_shader_info(shader->tokens,\r
-                  &brw_fp->info2);\r
-#endif\r
-\r
-   tgsi_dump(shader->tokens, 0);\r
-\r
-\r
-   return (void *)brw_fp;\r
-}\r
-\r
-static void brw_bind_fs_state(struct pipe_context *pipe, void *shader)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.FragmentProgram = (struct brw_fragment_program *)shader;\r
-   brw->state.dirty.brw |= BRW_NEW_FS;\r
-}\r
-\r
-static void brw_delete_fs_state(struct pipe_context *pipe, void *shader)\r
-{\r
-   struct brw_fragment_program *brw_fp = (struct brw_fragment_program *) shader;\r
-\r
-   FREE((void *) brw_fp->program.tokens);\r
-   FREE(brw_fp);\r
-}\r
-\r
-\r
-/************************************************************************\r
- * Vertex shader and other TNL state \r
- */\r
-\r
-static void *brw_create_vs_state(struct pipe_context *pipe,\r
-                                 const struct pipe_shader_state *shader)\r
-{\r
-   struct brw_vertex_program *brw_vp = CALLOC_STRUCT(brw_vertex_program);\r
-\r
-   brw_vp->program.tokens = tgsi_dup_tokens(shader->tokens);\r
-   brw_vp->id = brw_context(pipe)->program_id++;\r
-\r
-   tgsi_scan_shader(shader->tokens, &brw_vp->info);\r
-\r
-#if 0\r
-   brw_shader_info(shader->tokens,\r
-                  &brw_vp->info2);\r
-#endif\r
-   tgsi_dump(shader->tokens, 0);\r
-\r
-   return (void *)brw_vp;\r
-}\r
-\r
-static void brw_bind_vs_state(struct pipe_context *pipe, void *vs)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.VertexProgram = (struct brw_vertex_program *)vs;\r
-   brw->state.dirty.brw |= BRW_NEW_VS;\r
-\r
-   debug_printf("YYYYYYYYYYYYY BINDING VERTEX SHADER\n");\r
-}\r
-\r
-static void brw_delete_vs_state(struct pipe_context *pipe, void *shader)\r
-{\r
-   struct brw_vertex_program *brw_vp = (struct brw_vertex_program *) shader;\r
-\r
-   FREE((void *) brw_vp->program.tokens);\r
-   FREE(brw_vp);\r
-}\r
-\r
-\r
-static void brw_set_clip_state( struct pipe_context *pipe,\r
-                                const struct pipe_clip_state *clip )\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.Clip = *clip;\r
-}\r
-\r
-\r
-static void brw_set_viewport_state( struct pipe_context *pipe,\r
-                                    const struct pipe_viewport_state *viewport )\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.Viewport = *viewport; /* struct copy */\r
-   brw->state.dirty.brw |= BRW_NEW_VIEWPORT;\r
-\r
-   /* pass the viewport info to the draw module */\r
-   //draw_set_viewport_state(brw->draw, viewport);\r
-}\r
-\r
-\r
-static void brw_set_vertex_buffers(struct pipe_context *pipe,\r
-                                  unsigned count,\r
-                                  const struct pipe_vertex_buffer *buffers)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-   memcpy(brw->vb.vbo_array, buffers, count * sizeof(buffers[0]));\r
-}\r
-\r
-static void brw_set_vertex_elements(struct pipe_context *pipe,\r
-                                    unsigned count,\r
-                                    const struct pipe_vertex_element *elements)\r
-{\r
-   /* flush ? */\r
-   struct brw_context *brw = brw_context(pipe);\r
-   uint i;\r
-\r
-   assert(count <= PIPE_MAX_ATTRIBS);\r
-\r
-   for (i = 0; i < count; i++) {\r
-      struct brw_vertex_element_state el;\r
-      memset(&el, 0, sizeof(el));\r
-\r
-      el.ve0.src_offset = elements[i].src_offset;\r
-      el.ve0.src_format = brw_translate_surface_format(elements[i].src_format);\r
-      el.ve0.valid = 1;\r
-      el.ve0.vertex_buffer_index = elements[i].vertex_buffer_index;\r
-\r
-      el.ve1.dst_offset   = i * 4;\r
-\r
-      el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_SRC;\r
-      el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_SRC;\r
-      el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_SRC;\r
-      el.ve1.vfcomponent0 = BRW_VFCOMPONENT_STORE_SRC;\r
-\r
-      switch (elements[i].nr_components) {\r
-      case 1: el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_0;\r
-      case 2: el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_0;\r
-      case 3: el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_1_FLT;\r
-         break;\r
-      }\r
-\r
-      brw->vb.inputs[i] = el;\r
-   }\r
-}\r
-\r
-\r
-\r
-/************************************************************************\r
- * Constant buffers\r
- */\r
-\r
-static void brw_set_constant_buffer(struct pipe_context *pipe,\r
-                                     uint shader, uint index,\r
-                                     const struct pipe_constant_buffer *buf)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   assert(buf == 0 || index == 0);\r
-\r
-   brw->attribs.Constants[shader] = buf;\r
-   brw->state.dirty.brw |= BRW_NEW_CONSTANTS;\r
-}\r
-\r
-\r
-/************************************************************************\r
- * Texture surfaces\r
- */\r
-\r
-\r
-static void brw_set_sampler_textures(struct pipe_context *pipe,\r
-                                     unsigned num,\r
-                                     struct pipe_texture **texture)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-   uint i;\r
-\r
-   assert(num <= PIPE_MAX_SAMPLERS);\r
-\r
-   /* Check for no-op */\r
-   if (num == brw->num_textures &&\r
-       !memcmp(brw->attribs.Texture, texture, num *\r
-               sizeof(struct pipe_texture *)))\r
-      return;\r
-\r
-   for (i = 0; i < num; i++)\r
-      pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],\r
-                             texture[i]);\r
-\r
-   for (i = num; i < brw->num_textures; i++)\r
-      pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],\r
-                             NULL);\r
-\r
-   brw->num_textures = num;\r
-\r
-   brw->state.dirty.brw |= BRW_NEW_TEXTURE;\r
-}\r
-\r
-\r
-/************************************************************************\r
- * Render targets, etc\r
- */\r
-\r
-static void brw_set_framebuffer_state(struct pipe_context *pipe,\r
-                                      const struct pipe_framebuffer_state *fb)\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.FrameBuffer = *fb; /* struct copy */\r
-\r
-   brw->state.dirty.brw |= BRW_NEW_FRAMEBUFFER;\r
-}\r
-\r
-\r
-\r
-/************************************************************************\r
- * Rasterizer state\r
- */\r
-\r
-static void *\r
-brw_create_rasterizer_state(struct pipe_context *pipe,\r
-                             const struct pipe_rasterizer_state *rasterizer)\r
-{\r
-   DUP(pipe_rasterizer_state, rasterizer);\r
-}\r
-\r
-static void brw_bind_rasterizer_state( struct pipe_context *pipe,\r
-                                        void *setup )\r
-{\r
-   struct brw_context *brw = brw_context(pipe);\r
-\r
-   brw->attribs.Raster = (struct pipe_rasterizer_state *)setup;\r
-\r
-   /* Also pass-through to draw module:\r
-    */\r
-   //draw_set_rasterizer_state(brw->draw, setup);\r
-\r
-   brw->state.dirty.brw |= BRW_NEW_RASTERIZER;\r
-}\r
-\r
-static void brw_delete_rasterizer_state(struct pipe_context *pipe,\r
-                                         void *setup)\r
-{\r
-   free(setup);\r
-}\r
-\r
-\r
-\r
-void\r
-brw_init_state_functions( struct brw_context *brw )\r
-{\r
-   brw->pipe.create_blend_state = brw_create_blend_state;\r
-   brw->pipe.bind_blend_state = brw_bind_blend_state;\r
-   brw->pipe.delete_blend_state = brw_delete_blend_state;\r
-\r
-   brw->pipe.create_sampler_state = brw_create_sampler_state;\r
-   brw->pipe.bind_sampler_states = brw_bind_sampler_states;\r
-   brw->pipe.delete_sampler_state = brw_delete_sampler_state;\r
-\r
-   brw->pipe.create_depth_stencil_alpha_state = brw_create_depth_stencil_state;\r
-   brw->pipe.bind_depth_stencil_alpha_state = brw_bind_depth_stencil_state;\r
-   brw->pipe.delete_depth_stencil_alpha_state = brw_delete_depth_stencil_state;\r
-\r
-   brw->pipe.create_rasterizer_state = brw_create_rasterizer_state;\r
-   brw->pipe.bind_rasterizer_state = brw_bind_rasterizer_state;\r
-   brw->pipe.delete_rasterizer_state = brw_delete_rasterizer_state;\r
-   brw->pipe.create_fs_state = brw_create_fs_state;\r
-   brw->pipe.bind_fs_state = brw_bind_fs_state;\r
-   brw->pipe.delete_fs_state = brw_delete_fs_state;\r
-   brw->pipe.create_vs_state = brw_create_vs_state;\r
-   brw->pipe.bind_vs_state = brw_bind_vs_state;\r
-   brw->pipe.delete_vs_state = brw_delete_vs_state;\r
-\r
-   brw->pipe.set_blend_color = brw_set_blend_color;\r
-   brw->pipe.set_clip_state = brw_set_clip_state;\r
-   brw->pipe.set_constant_buffer = brw_set_constant_buffer;\r
-   brw->pipe.set_framebuffer_state = brw_set_framebuffer_state;\r
-\r
-//   brw->pipe.set_feedback_state = brw_set_feedback_state;\r
-//   brw->pipe.set_feedback_buffer = brw_set_feedback_buffer;\r
-\r
-   brw->pipe.set_polygon_stipple = brw_set_polygon_stipple;\r
-   brw->pipe.set_scissor_state = brw_set_scissor_state;\r
-   brw->pipe.set_sampler_textures = brw_set_sampler_textures;\r
-   brw->pipe.set_viewport_state = brw_set_viewport_state;\r
-   brw->pipe.set_vertex_buffers = brw_set_vertex_buffers;\r
-   brw->pipe.set_vertex_elements = brw_set_vertex_elements;\r
-}\r
+/**************************************************************************
+ *
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * 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 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 TUNGSTEN GRAPHICS AND/OR ITS 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.
+ *
+ **************************************************************************/
+
+/* Authors:  Zack Rusin <zack@tungstengraphics.com>
+ *           Keith Whitwell <keith@tungstengraphics.com>
+ */
+
+
+#include "pipe/internal/p_winsys_screen.h"
+#include "util/u_memory.h"
+#include "pipe/p_inlines.h"
+#include "pipe/p_shader_tokens.h"
+#include "tgsi/tgsi_dump.h"
+#include "tgsi/tgsi_parse.h"
+
+#include "brw_context.h"
+#include "brw_defines.h"
+#include "brw_state.h"
+#include "brw_draw.h"
+
+
+#define DUP( TYPE, VAL )                        \
+do {                                            \
+   struct TYPE *x = malloc(sizeof(*x));         \
+   memcpy(x, VAL, sizeof(*x) );                 \
+   return x;                                    \
+} while (0)
+
+/************************************************************************
+ * Blend 
+ */
+static void *
+brw_create_blend_state(struct pipe_context *pipe,
+                        const struct pipe_blend_state *blend)
+{   
+   DUP( pipe_blend_state, blend );
+}
+
+static void brw_bind_blend_state(struct pipe_context *pipe,
+                                 void *blend)
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.Blend = (struct pipe_blend_state*)blend;
+   brw->state.dirty.brw |= BRW_NEW_BLEND;
+}
+
+
+static void brw_delete_blend_state(struct pipe_context *pipe, void *blend)
+{
+   free(blend);
+}
+
+static void brw_set_blend_color( struct pipe_context *pipe,
+                            const struct pipe_blend_color *blend_color )
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.BlendColor = *blend_color;
+
+   brw->state.dirty.brw |= BRW_NEW_BLEND;
+}
+
+/************************************************************************
+ * Sampler 
+ */
+
+static void *
+brw_create_sampler_state(struct pipe_context *pipe,
+                          const struct pipe_sampler_state *sampler)
+{
+   DUP( pipe_sampler_state, sampler );
+}
+
+static void brw_bind_sampler_states(struct pipe_context *pipe,
+                                    unsigned num, void **sampler)
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   assert(num <= PIPE_MAX_SAMPLERS);
+
+   /* Check for no-op */
+   if (num == brw->num_samplers &&
+       !memcmp(brw->attribs.Samplers, sampler, num * sizeof(void *)))
+      return;
+
+   memcpy(brw->attribs.Samplers, sampler, num * sizeof(void *));
+   memset(&brw->attribs.Samplers[num], 0, (PIPE_MAX_SAMPLERS - num) *
+          sizeof(void *));
+
+   brw->num_samplers = num;
+
+   brw->state.dirty.brw |= BRW_NEW_SAMPLER;
+}
+
+static void brw_delete_sampler_state(struct pipe_context *pipe,
+                                      void *sampler)
+{
+   free(sampler);
+}
+
+
+/************************************************************************
+ * Depth stencil 
+ */
+
+static void *
+brw_create_depth_stencil_state(struct pipe_context *pipe,
+                           const struct pipe_depth_stencil_alpha_state *depth_stencil)
+{
+   DUP( pipe_depth_stencil_alpha_state, depth_stencil );
+}
+
+static void brw_bind_depth_stencil_state(struct pipe_context *pipe,
+                                         void *depth_stencil)
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.DepthStencil = (const struct pipe_depth_stencil_alpha_state *)depth_stencil;
+
+   brw->state.dirty.brw |= BRW_NEW_DEPTH_STENCIL;
+}
+
+static void brw_delete_depth_stencil_state(struct pipe_context *pipe,
+                                           void *depth_stencil)
+{
+   free(depth_stencil);
+}
+
+/************************************************************************
+ * Scissor
+ */
+static void brw_set_scissor_state( struct pipe_context *pipe,
+                                 const struct pipe_scissor_state *scissor )
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   memcpy( &brw->attribs.Scissor, scissor, sizeof(*scissor) );
+   brw->state.dirty.brw |= BRW_NEW_SCISSOR;
+}
+
+
+/************************************************************************
+ * Stipple
+ */
+
+static void brw_set_polygon_stipple( struct pipe_context *pipe,
+                                   const struct pipe_poly_stipple *stipple )
+{
+}
+
+
+/************************************************************************
+ * Fragment shader
+ */
+
+static void * brw_create_fs_state(struct pipe_context *pipe,
+                                   const struct pipe_shader_state *shader)
+{
+   struct brw_fragment_program *brw_fp = CALLOC_STRUCT(brw_fragment_program);
+
+   brw_fp->program.tokens = tgsi_dup_tokens(shader->tokens);
+   brw_fp->id = brw_context(pipe)->program_id++;
+
+   tgsi_scan_shader(shader->tokens, &brw_fp->info);
+
+#if 0
+   brw_shader_info(shader->tokens,
+                  &brw_fp->info2);
+#endif
+
+   tgsi_dump(shader->tokens, 0);
+
+
+   return (void *)brw_fp;
+}
+
+static void brw_bind_fs_state(struct pipe_context *pipe, void *shader)
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.FragmentProgram = (struct brw_fragment_program *)shader;
+   brw->state.dirty.brw |= BRW_NEW_FS;
+}
+
+static void brw_delete_fs_state(struct pipe_context *pipe, void *shader)
+{
+   struct brw_fragment_program *brw_fp = (struct brw_fragment_program *) shader;
+
+   FREE((void *) brw_fp->program.tokens);
+   FREE(brw_fp);
+}
+
+
+/************************************************************************
+ * Vertex shader and other TNL state 
+ */
+
+static void *brw_create_vs_state(struct pipe_context *pipe,
+                                 const struct pipe_shader_state *shader)
+{
+   struct brw_vertex_program *brw_vp = CALLOC_STRUCT(brw_vertex_program);
+
+   brw_vp->program.tokens = tgsi_dup_tokens(shader->tokens);
+   brw_vp->id = brw_context(pipe)->program_id++;
+
+   tgsi_scan_shader(shader->tokens, &brw_vp->info);
+
+#if 0
+   brw_shader_info(shader->tokens,
+                  &brw_vp->info2);
+#endif
+   tgsi_dump(shader->tokens, 0);
+
+   return (void *)brw_vp;
+}
+
+static void brw_bind_vs_state(struct pipe_context *pipe, void *vs)
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.VertexProgram = (struct brw_vertex_program *)vs;
+   brw->state.dirty.brw |= BRW_NEW_VS;
+
+   debug_printf("YYYYYYYYYYYYY BINDING VERTEX SHADER\n");
+}
+
+static void brw_delete_vs_state(struct pipe_context *pipe, void *shader)
+{
+   struct brw_vertex_program *brw_vp = (struct brw_vertex_program *) shader;
+
+   FREE((void *) brw_vp->program.tokens);
+   FREE(brw_vp);
+}
+
+
+static void brw_set_clip_state( struct pipe_context *pipe,
+                                const struct pipe_clip_state *clip )
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.Clip = *clip;
+}
+
+
+static void brw_set_viewport_state( struct pipe_context *pipe,
+                                    const struct pipe_viewport_state *viewport )
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.Viewport = *viewport; /* struct copy */
+   brw->state.dirty.brw |= BRW_NEW_VIEWPORT;
+
+   /* pass the viewport info to the draw module */
+   //draw_set_viewport_state(brw->draw, viewport);
+}
+
+
+static void brw_set_vertex_buffers(struct pipe_context *pipe,
+                                  unsigned count,
+                                  const struct pipe_vertex_buffer *buffers)
+{
+   struct brw_context *brw = brw_context(pipe);
+   memcpy(brw->vb.vbo_array, buffers, count * sizeof(buffers[0]));
+}
+
+static void brw_set_vertex_elements(struct pipe_context *pipe,
+                                    unsigned count,
+                                    const struct pipe_vertex_element *elements)
+{
+   /* flush ? */
+   struct brw_context *brw = brw_context(pipe);
+   uint i;
+
+   assert(count <= PIPE_MAX_ATTRIBS);
+
+   for (i = 0; i < count; i++) {
+      struct brw_vertex_element_state el;
+      memset(&el, 0, sizeof(el));
+
+      el.ve0.src_offset = elements[i].src_offset;
+      el.ve0.src_format = brw_translate_surface_format(elements[i].src_format);
+      el.ve0.valid = 1;
+      el.ve0.vertex_buffer_index = elements[i].vertex_buffer_index;
+
+      el.ve1.dst_offset   = i * 4;
+
+      el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_SRC;
+      el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_SRC;
+      el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_SRC;
+      el.ve1.vfcomponent0 = BRW_VFCOMPONENT_STORE_SRC;
+
+      switch (elements[i].nr_components) {
+      case 1: el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_0;
+      case 2: el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_0;
+      case 3: el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_1_FLT;
+         break;
+      }
+
+      brw->vb.inputs[i] = el;
+   }
+}
+
+
+
+/************************************************************************
+ * Constant buffers
+ */
+
+static void brw_set_constant_buffer(struct pipe_context *pipe,
+                                     uint shader, uint index,
+                                     const struct pipe_constant_buffer *buf)
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   assert(buf == 0 || index == 0);
+
+   brw->attribs.Constants[shader] = buf;
+   brw->state.dirty.brw |= BRW_NEW_CONSTANTS;
+}
+
+
+/************************************************************************
+ * Texture surfaces
+ */
+
+
+static void brw_set_sampler_textures(struct pipe_context *pipe,
+                                     unsigned num,
+                                     struct pipe_texture **texture)
+{
+   struct brw_context *brw = brw_context(pipe);
+   uint i;
+
+   assert(num <= PIPE_MAX_SAMPLERS);
+
+   /* Check for no-op */
+   if (num == brw->num_textures &&
+       !memcmp(brw->attribs.Texture, texture, num *
+               sizeof(struct pipe_texture *)))
+      return;
+
+   for (i = 0; i < num; i++)
+      pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
+                             texture[i]);
+
+   for (i = num; i < brw->num_textures; i++)
+      pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
+                             NULL);
+
+   brw->num_textures = num;
+
+   brw->state.dirty.brw |= BRW_NEW_TEXTURE;
+}
+
+
+/************************************************************************
+ * Render targets, etc
+ */
+
+static void brw_set_framebuffer_state(struct pipe_context *pipe,
+                                      const struct pipe_framebuffer_state *fb)
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.FrameBuffer = *fb; /* struct copy */
+
+   brw->state.dirty.brw |= BRW_NEW_FRAMEBUFFER;
+}
+
+
+
+/************************************************************************
+ * Rasterizer state
+ */
+
+static void *
+brw_create_rasterizer_state(struct pipe_context *pipe,
+                             const struct pipe_rasterizer_state *rasterizer)
+{
+   DUP(pipe_rasterizer_state, rasterizer);
+}
+
+static void brw_bind_rasterizer_state( struct pipe_context *pipe,
+                                        void *setup )
+{
+   struct brw_context *brw = brw_context(pipe);
+
+   brw->attribs.Raster = (struct pipe_rasterizer_state *)setup;
+
+   /* Also pass-through to draw module:
+    */
+   //draw_set_rasterizer_state(brw->draw, setup);
+
+   brw->state.dirty.brw |= BRW_NEW_RASTERIZER;
+}
+
+static void brw_delete_rasterizer_state(struct pipe_context *pipe,
+                                         void *setup)
+{
+   free(setup);
+}
+
+
+
+void
+brw_init_state_functions( struct brw_context *brw )
+{
+   brw->pipe.create_blend_state = brw_create_blend_state;
+   brw->pipe.bind_blend_state = brw_bind_blend_state;
+   brw->pipe.delete_blend_state = brw_delete_blend_state;
+
+   brw->pipe.create_sampler_state = brw_create_sampler_state;
+   brw->pipe.bind_sampler_states = brw_bind_sampler_states;
+   brw->pipe.delete_sampler_state = brw_delete_sampler_state;
+
+   brw->pipe.create_depth_stencil_alpha_state = brw_create_depth_stencil_state;
+   brw->pipe.bind_depth_stencil_alpha_state = brw_bind_depth_stencil_state;
+   brw->pipe.delete_depth_stencil_alpha_state = brw_delete_depth_stencil_state;
+
+   brw->pipe.create_rasterizer_state = brw_create_rasterizer_state;
+   brw->pipe.bind_rasterizer_state = brw_bind_rasterizer_state;
+   brw->pipe.delete_rasterizer_state = brw_delete_rasterizer_state;
+   brw->pipe.create_fs_state = brw_create_fs_state;
+   brw->pipe.bind_fs_state = brw_bind_fs_state;
+   brw->pipe.delete_fs_state = brw_delete_fs_state;
+   brw->pipe.create_vs_state = brw_create_vs_state;
+   brw->pipe.bind_vs_state = brw_bind_vs_state;
+   brw->pipe.delete_vs_state = brw_delete_vs_state;
+
+   brw->pipe.set_blend_color = brw_set_blend_color;
+   brw->pipe.set_clip_state = brw_set_clip_state;
+   brw->pipe.set_constant_buffer = brw_set_constant_buffer;
+   brw->pipe.set_framebuffer_state = brw_set_framebuffer_state;
+
+//   brw->pipe.set_feedback_state = brw_set_feedback_state;
+//   brw->pipe.set_feedback_buffer = brw_set_feedback_buffer;
+
+   brw->pipe.set_polygon_stipple = brw_set_polygon_stipple;
+   brw->pipe.set_scissor_state = brw_set_scissor_state;
+   brw->pipe.set_sampler_textures = brw_set_sampler_textures;
+   brw->pipe.set_viewport_state = brw_set_viewport_state;
+   brw->pipe.set_vertex_buffers = brw_set_vertex_buffers;
+   brw->pipe.set_vertex_elements = brw_set_vertex_elements;
+}