gallium: remove user_buffer_create from the interface
[mesa.git] / src / gallium / drivers / softpipe / sp_state_shader.c
index da895270aa97b398b1ad248b455a9e71d0b8fa30..910d4ba11a5113725ba7734ac4b040fdf3547ba7 100644 (file)
@@ -55,18 +55,17 @@ create_fs_variant(struct softpipe_context *softpipe,
    struct pipe_shader_state *stipple_fs = NULL, *curfs = &fs->shader;
    unsigned unit = 0;
 
+#if DO_PSTIPPLE_IN_HELPER_MODULE
    if (key->polygon_stipple) {
       /* get new shader that implements polygon stippling */
       stipple_fs = util_pstipple_create_fragment_shader(&softpipe->pipe,
                                                         curfs, &unit);
       curfs = stipple_fs;
    }
+#endif
 
    /* codegen, create variant object */
-   var = softpipe_create_fs_variant_sse(softpipe, curfs);
-   if (!var) {
-      var = softpipe_create_fs_variant_exec(softpipe, curfs);
-   }
+   var = softpipe_create_fs_variant_exec(softpipe, curfs);
 
    if (var) {
       var->key = *key;
@@ -93,8 +92,8 @@ create_fs_variant(struct softpipe_context *softpipe,
    }
 
    if (stipple_fs) {
-      free((void *) stipple_fs->tokens);
-      free(stipple_fs);
+      FREE((void *) stipple_fs->tokens);
+      FREE(stipple_fs);
    }
 
    return var;
@@ -205,6 +204,7 @@ softpipe_delete_fs_state(struct pipe_context *pipe, void *fs)
    draw_delete_fragment_shader(softpipe->draw, state->draw_shader);
 
    FREE((void *) state->shader.tokens);
+   FREE(state);
 }
 
 
@@ -333,6 +333,8 @@ softpipe_delete_gs_state(struct pipe_context *pipe, void *gs)
 
    draw_delete_geometry_shader(softpipe->draw,
                                (state) ? state->draw_data : 0);
+
+   FREE((void *) state->shader.tokens);
    FREE(state);
 }
 
@@ -340,11 +342,22 @@ softpipe_delete_gs_state(struct pipe_context *pipe, void *gs)
 static void
 softpipe_set_constant_buffer(struct pipe_context *pipe,
                              uint shader, uint index,
-                             struct pipe_resource *constants)
+                             struct pipe_constant_buffer *cb)
 {
    struct softpipe_context *softpipe = softpipe_context(pipe);
-   unsigned size = constants ? constants->width0 : 0;
-   const void *data = constants ? softpipe_resource(constants)->data : NULL;
+   struct pipe_resource *constants = cb ? cb->buffer : NULL;
+   unsigned size;
+   const void *data;
+
+   if (cb && cb->user_buffer) {
+      constants = softpipe_user_buffer_create(pipe->screen,
+                                              (void *) cb->user_buffer,
+                                              cb->buffer_size,
+                                              PIPE_BIND_CONSTANT_BUFFER);
+   }
+
+   size = constants ? constants->width0 : 0;
+   data = constants ? softpipe_resource(constants)->data : NULL;
 
    assert(shader < PIPE_SHADER_TYPES);
 
@@ -361,6 +374,10 @@ softpipe_set_constant_buffer(struct pipe_context *pipe,
    softpipe->const_buffer_size[shader][index] = size;
 
    softpipe->dirty |= SP_NEW_CONSTANTS;
+
+   if (cb && cb->user_buffer) {
+      pipe_resource_reference(&constants, NULL);
+   }
 }