Squashed commit of the following:
[mesa.git] / src / gallium / drivers / nvfx / nvfx_state.c
index 7e138afc717b06d4c5b37032a9266e1d7c6869d2..e11ab46c425db0dbc411fe9833bf9414f5c6d743 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "nvfx_context.h"
 #include "nvfx_state.h"
+#include "nvfx_tex.h"
 
 static void *
 nvfx_blend_state_create(struct pipe_context *pipe,
@@ -82,8 +83,35 @@ nvfx_blend_state_delete(struct pipe_context *pipe, void *hwcso)
        FREE(bso);
 }
 
+static void *
+nvfx_sampler_state_create(struct pipe_context *pipe,
+                         const struct pipe_sampler_state *cso)
+{
+       struct nvfx_context *nvfx = nvfx_context(pipe);
+       struct nvfx_sampler_state *ps;
+
+       ps = MALLOC(sizeof(struct nvfx_sampler_state));
+
+       /* on nv30, we use this as an internal flag */
+       ps->fmt = cso->normalized_coords ? 0 : NV40TCL_TEX_FORMAT_RECT;
+       ps->en = 0;
+       ps->filt = nvfx_tex_filter(cso);
+       ps->wrap = (nvfx_tex_wrap_mode(cso->wrap_s) << NV34TCL_TX_WRAP_S_SHIFT) |
+                   (nvfx_tex_wrap_mode(cso->wrap_t) << NV34TCL_TX_WRAP_T_SHIFT) |
+                   (nvfx_tex_wrap_mode(cso->wrap_r) << NV34TCL_TX_WRAP_R_SHIFT) |
+                   nvfx_tex_wrap_compare_mode(cso);
+       ps->bcol = nvfx_tex_border_color(cso->border_color);
+
+       if(nvfx->is_nv4x)
+               nv40_sampler_state_init(pipe, ps, cso);
+       else
+               nv30_sampler_state_init(pipe, ps, cso);
+
+       return (void *)ps;
+}
+
 static void
-nv40_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **sampler)
+nvfx_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **sampler)
 {
        struct nvfx_context *nvfx = nvfx_context(pipe);
        unsigned unit;
@@ -103,27 +131,28 @@ nv40_sampler_state_bind(struct pipe_context *pipe, unsigned nr, void **sampler)
 }
 
 static void
-nv40_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
+nvfx_sampler_state_delete(struct pipe_context *pipe, void *hwcso)
 {
        FREE(hwcso);
 }
 
 static void
-nvfx_set_sampler_texture(struct pipe_context *pipe, unsigned nr,
-                        struct pipe_texture **miptree)
+nvfx_set_fragment_sampler_views(struct pipe_context *pipe,
+                               unsigned nr,
+                               struct pipe_sampler_view **views)
 {
        struct nvfx_context *nvfx = nvfx_context(pipe);
        unsigned unit;
 
        for (unit = 0; unit < nr; unit++) {
-               pipe_texture_reference((struct pipe_texture **)
-                                      &nvfx->tex_miptree[unit], miptree[unit]);
+               pipe_sampler_view_reference(&nvfx->fragment_sampler_views[unit],
+                                            views[unit]);
                nvfx->dirty_samplers |= (1 << unit);
        }
 
        for (unit = nr; unit < nvfx->nr_textures; unit++) {
-               pipe_texture_reference((struct pipe_texture **)
-                                      &nvfx->tex_miptree[unit], NULL);
+               pipe_sampler_view_reference(&nvfx->fragment_sampler_views[unit],
+                                            NULL);
                nvfx->dirty_samplers |= (1 << unit);
        }
 
@@ -131,6 +160,34 @@ nvfx_set_sampler_texture(struct pipe_context *pipe, unsigned nr,
        nvfx->dirty |= NVFX_NEW_SAMPLER;
 }
 
+
+static struct pipe_sampler_view *
+nvfx_create_sampler_view(struct pipe_context *pipe,
+                        struct pipe_resource *texture,
+                        const struct pipe_sampler_view *templ)
+{
+       struct pipe_sampler_view *view = CALLOC_STRUCT(pipe_sampler_view);
+
+       if (view) {
+               *view = *templ;
+               view->reference.count = 1;
+               view->texture = NULL;
+               pipe_resource_reference(&view->texture, texture);
+               view->context = pipe;
+       }
+
+       return view;
+}
+
+
+static void
+nvfx_sampler_view_destroy(struct pipe_context *pipe,
+                         struct pipe_sampler_view *view)
+{
+       pipe_resource_reference(&view->texture, NULL);
+       FREE(view);
+}
+
 static void *
 nvfx_rasterizer_state_create(struct pipe_context *pipe,
                             const struct pipe_rasterizer_state *cso)
@@ -442,12 +499,12 @@ nvfx_set_clip_state(struct pipe_context *pipe,
 
 static void
 nvfx_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
-                        struct pipe_buffer *buf )
+                        struct pipe_resource *buf )
 {
        struct nvfx_context *nvfx = nvfx_context(pipe);
 
        nvfx->constbuf[shader] = buf;
-       nvfx->constbuf_nr[shader] = buf->size / (4 * sizeof(float));
+       nvfx->constbuf_nr[shader] = buf->width0 / (4 * sizeof(float));
 
        if (shader == PIPE_SHADER_VERTEX) {
                nvfx->dirty |= NVFX_NEW_VERTPROG;
@@ -543,14 +600,6 @@ nvfx_vtxelts_state_bind(struct pipe_context *pipe, void *hwcso)
        /*nvfx->draw_dirty |= NVFX_NEW_ARRAYS;*/
 }
 
-void *
-nv30_sampler_state_create(struct pipe_context *pipe,
-                         const struct pipe_sampler_state *cso);
-
-void *
-nv40_sampler_state_create(struct pipe_context *pipe,
-                         const struct pipe_sampler_state *cso);
-
 void
 nvfx_init_state_functions(struct nvfx_context *nvfx)
 {
@@ -558,13 +607,12 @@ nvfx_init_state_functions(struct nvfx_context *nvfx)
        nvfx->pipe.bind_blend_state = nvfx_blend_state_bind;
        nvfx->pipe.delete_blend_state = nvfx_blend_state_delete;
 
-       if(nvfx->is_nv4x)
-               nvfx->pipe.create_sampler_state = nv40_sampler_state_create;
-       else
-               nvfx->pipe.create_sampler_state = nv30_sampler_state_create;
-       nvfx->pipe.bind_fragment_sampler_states = nv40_sampler_state_bind;
-       nvfx->pipe.delete_sampler_state = nv40_sampler_state_delete;
-       nvfx->pipe.set_fragment_sampler_textures = nvfx_set_sampler_texture;
+       nvfx->pipe.create_sampler_state = nvfx_sampler_state_create;
+       nvfx->pipe.bind_fragment_sampler_states = nvfx_sampler_state_bind;
+       nvfx->pipe.delete_sampler_state = nvfx_sampler_state_delete;
+       nvfx->pipe.set_fragment_sampler_views = nvfx_set_fragment_sampler_views;
+        nvfx->pipe.create_sampler_view = nvfx_create_sampler_view;
+        nvfx->pipe.sampler_view_destroy = nvfx_sampler_view_destroy;
 
        nvfx->pipe.create_rasterizer_state = nvfx_rasterizer_state_create;
        nvfx->pipe.bind_rasterizer_state = nvfx_rasterizer_state_bind;