Home | History | Annotate | Download | only in svga
      1 /**********************************************************
      2  * Copyright 2008-2009 VMware, Inc.  All rights reserved.
      3  *
      4  * Permission is hereby granted, free of charge, to any person
      5  * obtaining a copy of this software and associated documentation
      6  * files (the "Software"), to deal in the Software without
      7  * restriction, including without limitation the rights to use, copy,
      8  * modify, merge, publish, distribute, sublicense, and/or sell copies
      9  * of the Software, and to permit persons to whom the Software is
     10  * furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be
     13  * included in all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
     19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
     20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     22  * SOFTWARE.
     23  *
     24  **********************************************************/
     25 
     26 #include "svga_resource_texture.h"
     27 #include "svga_context.h"
     28 #include "svga_debug.h"
     29 #include "svga_cmd.h"
     30 #include "svga_surface.h"
     31 
     32 #include "util/u_surface.h"
     33 
     34 #define FILE_DEBUG_FLAG DEBUG_BLIT
     35 
     36 
     37 /* XXX still have doubts about this... */
     38 static void svga_surface_copy(struct pipe_context *pipe,
     39                               struct pipe_resource* dst_tex,
     40                               unsigned dst_level,
     41                               unsigned dstx, unsigned dsty, unsigned dstz,
     42                               struct pipe_resource* src_tex,
     43                               unsigned src_level,
     44                               const struct pipe_box *src_box)
     45  {
     46    struct svga_context *svga = svga_context(pipe);
     47    struct svga_texture *stex, *dtex;
     48 /*   struct pipe_screen *screen = pipe->screen;
     49    SVGA3dCopyBox *box;
     50    enum pipe_error ret;
     51    struct pipe_surface *srcsurf, *dstsurf;*/
     52    unsigned dst_face, dst_z, src_face, src_z;
     53 
     54    /* Emit buffered drawing commands, and any back copies.
     55     */
     56    svga_surfaces_flush( svga );
     57 
     58    /* Fallback for buffers. */
     59    if (dst_tex->target == PIPE_BUFFER && src_tex->target == PIPE_BUFFER) {
     60       util_resource_copy_region(pipe, dst_tex, dst_level, dstx, dsty, dstz,
     61                                 src_tex, src_level, src_box);
     62       return;
     63    }
     64 
     65    stex = svga_texture(src_tex);
     66    dtex = svga_texture(dst_tex);
     67 
     68 #if 0
     69    srcsurf = screen->get_tex_surface(screen, src_tex,
     70                                      src_level, src_box->z, src_box->z,
     71                                      PIPE_BIND_SAMPLER_VIEW);
     72 
     73    dstsurf = screen->get_tex_surface(screen, dst_tex,
     74                                      dst_level, dst_box->z, dst_box->z,
     75                                      PIPE_BIND_RENDER_TARGET);
     76 
     77    SVGA_DBG(DEBUG_DMA, "blit to sid %p (%d,%d), from sid %p (%d,%d) sz %dx%d\n",
     78             svga_surface(dstsurf)->handle,
     79             dstx, dsty,
     80             svga_surface(srcsurf)->handle,
     81             src_box->x, src_box->y,
     82             width, height);
     83 
     84    ret = SVGA3D_BeginSurfaceCopy(svga->swc,
     85                                  srcsurf,
     86                                  dstsurf,
     87                                  &box,
     88                                  1);
     89    if(ret != PIPE_OK) {
     90 
     91       svga_context_flush(svga, NULL);
     92 
     93       ret = SVGA3D_BeginSurfaceCopy(svga->swc,
     94                                     srcsurf,
     95                                     dstsurf,
     96                                     &box,
     97                                     1);
     98       assert(ret == PIPE_OK);
     99    }
    100 
    101    box->x = dstx;
    102    box->y = dsty;
    103    box->z = 0;
    104    box->w = width;
    105    box->h = height;
    106    box->d = 1;
    107    box->srcx = src_box->x;
    108    box->srcy = src_box->y;
    109    box->srcz = 0;
    110 
    111    SVGA_FIFOCommitAll(svga->swc);
    112 
    113    svga_surface(dstsurf)->dirty = TRUE;
    114    svga_propagate_surface(pipe, dstsurf);
    115 
    116    pipe_surface_reference(&srcsurf, NULL);
    117    pipe_surface_reference(&dstsurf, NULL);
    118 
    119 #else
    120    if (src_tex->target == PIPE_TEXTURE_CUBE) {
    121       src_face = src_box->z;
    122       src_z = 0;
    123       assert(src_box->depth == 1);
    124    }
    125    else {
    126       src_face = 0;
    127       src_z = src_box->z;
    128    }
    129    /* different src/dst type???*/
    130    if (dst_tex->target == PIPE_TEXTURE_CUBE) {
    131       dst_face = dstz;
    132       dst_z = 0;
    133       assert(src_box->depth == 1);
    134    }
    135    else {
    136       dst_face = 0;
    137       dst_z = dstz;
    138    }
    139    svga_texture_copy_handle(svga,
    140                             stex->handle,
    141                             src_box->x, src_box->y, src_z,
    142                             src_level, src_face,
    143                             dtex->handle,
    144                             dstx, dsty, dst_z,
    145                             dst_level, dst_face,
    146                             src_box->width, src_box->height, src_box->depth);
    147 
    148 #endif
    149 
    150 }
    151 
    152 
    153 void
    154 svga_init_blit_functions(struct svga_context *svga)
    155 {
    156    svga->pipe.resource_copy_region = svga_surface_copy;
    157 }
    158