nv30, nv40: unify all structures and headers, except shaders
[mesa.git] / src / gallium / drivers / nv30 / nv30_transfer.c
index 98011decf7cac2c3f1e2a4cab30fe2be12f0f5d9..3d71df52b907eec9b403c7794dacc3149ec51a8e 100644 (file)
@@ -1,31 +1,30 @@
-#include <pipe/p_state.h>
-#include <pipe/p_defines.h>
-#include <pipe/p_inlines.h>
-#include <util/u_memory.h>
-#include <nouveau/nouveau_winsys.h>
+#include "pipe/p_state.h"
+#include "pipe/p_defines.h"
+#include "util/u_inlines.h"
+#include "util/u_format.h"
+#include "util/u_memory.h"
+#include "util/u_math.h"
+#include "nouveau/nouveau_winsys.h"
 #include "nv30_context.h"
-#include "nv30_screen.h"
-#include "nv30_state.h"
+#include "nvfx_screen.h"
+#include "nvfx_state.h"
 
 struct nv30_transfer {
        struct pipe_transfer base;
        struct pipe_surface *surface;
-       bool direct;
+       boolean direct;
 };
 
 static void
-nv30_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
+nv30_compatible_transfer_tex(struct pipe_texture *pt, unsigned width, unsigned height,
                              struct pipe_texture *template)
 {
        memset(template, 0, sizeof(struct pipe_texture));
        template->target = pt->target;
        template->format = pt->format;
-       template->width[0] = pt->width[level];
-       template->height[0] = pt->height[level];
-       template->depth[0] = 1;
-       template->block = pt->block;
-       template->nblocksx[0] = pt->nblocksx[level];
-       template->nblocksy[0] = pt->nblocksx[level];
+       template->width0 = width;
+       template->height0 = height;
+       template->depth0 = 1;
        template->last_level = 0;
        template->nr_samples = pt->nr_samples;
 
@@ -34,12 +33,13 @@ nv30_compatible_transfer_tex(struct pipe_texture *pt, unsigned level,
 }
 
 static struct pipe_transfer *
-nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
+nv30_transfer_new(struct pipe_context *pcontext, struct pipe_texture *pt,
                  unsigned face, unsigned level, unsigned zslice,
                  enum pipe_transfer_usage usage,
                  unsigned x, unsigned y, unsigned w, unsigned h)
 {
-       struct nv30_miptree *mt = (struct nv30_miptree *)pt;
+        struct pipe_screen *pscreen = pcontext->screen;
+       struct nvfx_miptree *mt = (struct nvfx_miptree *)pt;
        struct nv30_transfer *tx;
        struct pipe_texture tx_tex_template, *tx_tex;
 
@@ -48,14 +48,10 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
                return NULL;
 
        pipe_texture_reference(&tx->base.texture, pt);
-       tx->base.format = pt->format;
        tx->base.x = x;
        tx->base.y = y;
        tx->base.width = w;
        tx->base.height = h;
-       tx->base.block = pt->block;
-       tx->base.nblocksx = pt->nblocksx[level];
-       tx->base.nblocksy = pt->nblocksy[level];
        tx->base.stride = mt->level[level].pitch;
        tx->base.usage = usage;
        tx->base.face = face;
@@ -76,7 +72,7 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 
        tx->direct = false;
 
-       nv30_compatible_transfer_tex(pt, level, &tx_tex_template);
+       nv30_compatible_transfer_tex(pt, w, h, &tx_tex_template);
 
        tx_tex = pscreen->texture_create(pscreen, &tx_tex_template);
        if (!tx_tex)
@@ -85,6 +81,8 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
                return NULL;
        }
 
+       tx->base.stride = ((struct nvfx_miptree*)tx_tex)->level[0].pitch;
+
        tx->surface = pscreen->get_tex_surface(pscreen, tx_tex,
                                               0, 0, 0,
                                               pipe_transfer_buffer_flags(&tx->base));
@@ -99,7 +97,7 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
        }
 
        if (usage & PIPE_TRANSFER_READ) {
-               struct nv30_screen *nvscreen = nv30_screen(pscreen);
+               struct nvfx_screen *nvscreen = nvfx_screen(pscreen);
                struct pipe_surface *src;
 
                src = pscreen->get_tex_surface(pscreen, pt,
@@ -110,8 +108,8 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
                /* TODO: Check if SIFM can un-swizzle */
                nvscreen->eng2d->copy(nvscreen->eng2d,
                                      tx->surface, 0, 0,
-                                     src, 0, 0,
-                                     src->width, src->height);
+                                     src, x, y,
+                                     w, h);
 
                pipe_surface_reference(&src, NULL);
        }
@@ -120,24 +118,25 @@ nv30_transfer_new(struct pipe_screen *pscreen, struct pipe_texture *pt,
 }
 
 static void
-nv30_transfer_del(struct pipe_transfer *ptx)
+nv30_transfer_del(struct pipe_context *pcontext,
+                  struct pipe_transfer *ptx)
 {
        struct nv30_transfer *tx = (struct nv30_transfer *)ptx;
 
        if (!tx->direct && (ptx->usage & PIPE_TRANSFER_WRITE)) {
-               struct pipe_screen *pscreen = ptx->texture->screen;
-               struct nv30_screen *nvscreen = nv30_screen(pscreen);
+               struct pipe_screen *pscreen = pcontext->screen;
+               struct nvfx_screen *nvscreen = nvfx_screen(pscreen);
                struct pipe_surface *dst;
 
                dst = pscreen->get_tex_surface(pscreen, ptx->texture,
                                               ptx->face, ptx->level, ptx->zslice,
-                                              PIPE_BUFFER_USAGE_GPU_WRITE);
+                                              PIPE_BUFFER_USAGE_GPU_WRITE | NOUVEAU_BUFFER_USAGE_NO_RENDER);
 
                /* TODO: Check if SIFM can deal with x,y,w,h when swizzling */
                nvscreen->eng2d->copy(nvscreen->eng2d,
-                                     dst, 0, 0,
+                                     dst, tx->base.x, tx->base.y,
                                      tx->surface, 0, 0,
-                                     dst->width, dst->height);
+                                     tx->base.width, tx->base.height);
 
                pipe_surface_reference(&dst, NULL);
        }
@@ -148,32 +147,36 @@ nv30_transfer_del(struct pipe_transfer *ptx)
 }
 
 static void *
-nv30_transfer_map(struct pipe_screen *pscreen, struct pipe_transfer *ptx)
+nv30_transfer_map(struct pipe_context *pcontext, struct pipe_transfer *ptx)
 {
+        struct pipe_screen *pscreen = pcontext->screen;
        struct nv30_transfer *tx = (struct nv30_transfer *)ptx;
        struct nv04_surface *ns = (struct nv04_surface *)tx->surface;
-       struct nv30_miptree *mt = (struct nv30_miptree *)tx->surface->texture;
+       struct nvfx_miptree *mt = (struct nvfx_miptree *)tx->surface->texture;
        void *map = pipe_buffer_map(pscreen, mt->buffer,
                                    pipe_transfer_buffer_flags(ptx));
 
-       return map + ns->base.offset +
-              ptx->y * ns->pitch + ptx->x * ptx->block.size;
+       if(!tx->direct)
+               return map + ns->base.offset;
+       else
+               return map + ns->base.offset + ptx->y * ns->pitch + ptx->x * util_format_get_blocksize(ptx->texture->format);
 }
 
 static void
-nv30_transfer_unmap(struct pipe_screen *pscreen, struct pipe_transfer *ptx)
+nv30_transfer_unmap(struct pipe_context *pcontext, struct pipe_transfer *ptx)
 {
+        struct pipe_screen *pscreen = pcontext->screen;
        struct nv30_transfer *tx = (struct nv30_transfer *)ptx;
-       struct nv30_miptree *mt = (struct nv30_miptree *)tx->surface->texture;
+       struct nvfx_miptree *mt = (struct nvfx_miptree *)tx->surface->texture;
 
        pipe_buffer_unmap(pscreen, mt->buffer);
 }
 
 void
-nv30_screen_init_transfer_functions(struct pipe_screen *pscreen)
+nv30_init_transfer_functions(struct nvfx_context *nvfx)
 {
-       pscreen->get_tex_transfer = nv30_transfer_new;
-       pscreen->tex_transfer_destroy = nv30_transfer_del;
-       pscreen->transfer_map = nv30_transfer_map;
-       pscreen->transfer_unmap = nv30_transfer_unmap;
+       nvfx->pipe.get_tex_transfer = nv30_transfer_new;
+       nvfx->pipe.tex_transfer_destroy = nv30_transfer_del;
+       nvfx->pipe.transfer_map = nv30_transfer_map;
+       nvfx->pipe.transfer_unmap = nv30_transfer_unmap;
 }