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... */
38static 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
153void
154svga_init_blit_functions(struct svga_context *svga)
155{
156   svga->pipe.resource_copy_region = svga_surface_copy;
157}
158