nouveau: Add support for XvMC acceleration
[mesa.git] / src / gallium / drivers / nvfx / nvfx_surface.c
index be31853d7177c99e5651941b280d4e62a9dabebb..91ca1c3750ec0c29890d1e1f3fdfb6867e74b21b 100644 (file)
@@ -33,6 +33,7 @@
 #include "util/u_memory.h"
 #include "util/u_pack_color.h"
 #include "util/u_blitter.h"
+#include "util/u_surface.h"
 
 #include "nouveau/nouveau_winsys.h"
 #include "nouveau/nouveau_screen.h"
@@ -83,7 +84,7 @@ nvfx_region_set_format(struct nv04_region* rgn, enum pipe_format format)
 }
 
 static INLINE void
-nvfx_region_init_for_surface(struct nv04_region* rgn, struct nvfx_surface* surf, unsigned x, unsigned y, bool for_write)
+nvfx_region_init_for_surface(struct nv04_region* rgn, struct nvfx_surface* surf, unsigned x, unsigned y, boolean for_write)
 {
        rgn->x = x;
        rgn->y = y;
@@ -101,7 +102,7 @@ nvfx_region_init_for_surface(struct nv04_region* rgn, struct nvfx_surface* surf,
                rgn->bo = ((struct nvfx_resource*)surf->base.base.texture)->bo;
                rgn->offset = surf->offset;
 
-               if(surf->base.base.texture->flags & NVFX_RESOURCE_FLAG_LINEAR)
+               if(surf->base.base.texture->flags & NOUVEAU_RESOURCE_FLAG_LINEAR)
                        rgn->pitch = surf->pitch;
                else
                {
@@ -119,7 +120,7 @@ nvfx_region_init_for_surface(struct nv04_region* rgn, struct nvfx_surface* surf,
 }
 
 static INLINE void
-nvfx_region_init_for_subresource(struct nv04_region* rgn, struct pipe_resource* pt, unsigned level, unsigned x, unsigned y, unsigned z, bool for_write)
+nvfx_region_init_for_subresource(struct nv04_region* rgn, struct pipe_resource* pt, unsigned level, unsigned x, unsigned y, unsigned z, boolean for_write)
 {
        if(pt->target != PIPE_BUFFER)
        {
@@ -136,7 +137,7 @@ nvfx_region_init_for_subresource(struct nv04_region* rgn, struct pipe_resource*
        rgn->x = x;
        rgn->y = y;
 
-       if(pt->flags & NVFX_RESOURCE_FLAG_LINEAR)
+       if(pt->flags & NOUVEAU_RESOURCE_FLAG_LINEAR)
        {
                rgn->pitch = nvfx_subresource_pitch(pt, level);
                rgn->z = 0;
@@ -252,6 +253,13 @@ nvfx_resource_copy_region(struct pipe_context *pipe,
        if(!w || !h)
                return;
 
+        /* Fallback for buffers. */
+        if (dstr->target == PIPE_BUFFER && srcr->target == PIPE_BUFFER) {
+                util_resource_copy_region(pipe, dstr, dst_level, dstx, dsty, dstz,
+                                          srcr, src_level, src_box);
+                return;
+        }
+
        if(copy_threshold < 0)
                copy_threshold = debug_get_num_option("NOUVEAU_COPY_THRESHOLD", 4);
 
@@ -280,7 +288,7 @@ nvfx_resource_copy_region(struct pipe_context *pipe,
                 * TODO: perhaps support reinterpreting the formats
                 */
                struct blitter_context* blitter = nvfx_get_blitter(pipe, 1);
-               util_blitter_copy_region(blitter, dstr, dst_level, dstx, dsty, dstz, srcr, src_level, src_box, TRUE);
+               util_blitter_copy_texture(blitter, dstr, dst_level, dstx, dsty, dstz, srcr, src_level, src_box, TRUE);
                nvfx_put_blitter(pipe, blitter);
        }
        else
@@ -430,7 +438,7 @@ nvfx_surface_create_temp(struct pipe_context* pipe, struct pipe_surface* surf)
        template.height0 = surf->height;
        template.depth0 = 1;
        template.nr_samples = surf->texture->nr_samples;
-       template.flags = NVFX_RESOURCE_FLAG_LINEAR;
+       template.flags = NOUVEAU_RESOURCE_FLAG_LINEAR;
 
        assert(!ns->temp && !util_dirty_surface_is_dirty(&ns->base));