Squashed commit of the following:
[mesa.git] / src / gallium / state_trackers / python / p_state.i
index 7f5760b3b66da4a10f104fca0a3b943f094f0f7e..c1e6ea1b43c9d990fa13479bbcce03885ca2858a 100644 (file)
 %ignore winsys;
 %ignore pipe_vertex_buffer::buffer;
 
+%include "pipe/p_compiler.h";
 %include "pipe/p_state.h";
 
 
 %array_class(struct pipe_stencil_state, StencilArray);
 
 
+%extend pipe_rt_blend_state
+{
+   struct pipe_rt_blend_state *
+   __getitem__(int index) 
+   {
+      if(index < 0 || index >= PIPE_MAX_COLOR_BUFS)
+         SWIG_exception(SWIG_ValueError, "index out of bounds");
+      return $self + index;
+   fail:
+      return NULL;
+   };
+};
+
+
+%extend pipe_blend_state
+{
+   pipe_blend_state(void)
+   {
+      return CALLOC_STRUCT(pipe_blend_state);
+   }
+
+   %cstring_input_binary(const char *STRING, unsigned LENGTH);
+   pipe_blend_state(const char *STRING, unsigned LENGTH)
+   {
+      struct pipe_blend_state *state;
+      state = CALLOC_STRUCT(pipe_blend_state);
+      if (state) {
+         LENGTH = MIN2(sizeof *state, LENGTH);
+         memcpy(state, STRING, LENGTH);
+      }
+      return state;
+   }
+
+   %cstring_output_allocate_size(char **STRING, int *LENGTH, os_free(*$1));
+   void __str__(char **STRING, int *LENGTH)
+   {
+      struct os_stream *stream;
+
+      stream = os_str_stream_create(1);
+      util_dump_blend_state(stream, $self);
+
+      *STRING = os_str_stream_get_and_close(stream);
+      *LENGTH = strlen(*STRING);
+   }
+};
+
+
 %extend pipe_framebuffer_state {
    
    pipe_framebuffer_state(void) {
    }
    
    void
-   set_cbuf(unsigned index, struct pipe_surface *surface) {
-      pipe_surface_reference(&$self->cbufs[index], surface);
+   set_cbuf(unsigned index, struct st_surface *surface) 
+   {
+      struct pipe_surface *_surface = NULL;
+
+      if(index >= PIPE_MAX_COLOR_BUFS)
+         SWIG_exception(SWIG_ValueError, "index out of bounds");
+      
+      if(surface) {
+         _surface = st_pipe_surface(surface, PIPE_BIND_RENDER_TARGET);
+         if(!_surface)
+            SWIG_exception(SWIG_ValueError, "couldn't acquire surface for writing");
+      }
+
+      pipe_surface_reference(&$self->cbufs[index], _surface);
+      
+   fail:
+      return;
    }
    
    void
-   set_zsbuf(struct pipe_surface *surface) {
-      pipe_surface_reference(&$self->zsbuf, surface);
+   set_zsbuf(struct st_surface *surface) 
+   {
+      struct pipe_surface *_surface = NULL;
+
+      if(surface) {
+         _surface = st_pipe_surface(surface, PIPE_BIND_DEPTH_STENCIL);
+         if(!_surface)
+            SWIG_exception(SWIG_ValueError, "couldn't acquire surface for writing");
+      }
+
+      pipe_surface_reference(&$self->zsbuf, _surface);
+
+   fail:
+      return;
    }
    
 };