1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008-2009 VMware, Inc.  All rights reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * obtaining a copy of this software and associated documentation
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * files (the "Software"), to deal in the Software without
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * restriction, including without limitation the rights to use, copy,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modify, merge, publish, distribute, sublicense, and/or sell copies
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software, and to permit persons to whom the Software is
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * furnished to do so, subject to the following conditions:
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * included in all copies or substantial portions of the Software.
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************/
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_cmd.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "os/os_thread.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_format.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_screen.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_context.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_resource_texture.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_surface.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "svga_debug.h"
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_texture_copy_handle(struct svga_context *svga,
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct svga_winsys_surface *src_handle,
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned src_x, unsigned src_y, unsigned src_z,
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned src_level, unsigned src_face,
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         struct svga_winsys_surface *dst_handle,
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned dst_x, unsigned dst_y, unsigned dst_z,
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned dst_level, unsigned dst_face,
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned width, unsigned height, unsigned depth)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_surface dst, src;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_error ret;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA3dCopyBox box, *boxes;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(svga);
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src.handle = src_handle;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src.real_level = src_level;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src.real_face = src_face;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src.real_zslice = 0;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst.handle = dst_handle;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst.real_level = dst_level;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst.real_face = dst_face;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst.real_zslice = 0;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.x = dst_x;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.y = dst_y;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.z = dst_z;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.w = width;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.h = height;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.d = depth;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.srcx = src_x;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.srcy = src_y;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   box.srcz = src_z;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA_DBG(DEBUG_VIEWS, "mipcopy src: %p %u (%ux%ux%u), dst: %p %u (%ux%ux%u)\n",
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            src_handle, src_level, src_x, src_y, src_z,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst_handle, dst_level, dst_x, dst_y, dst_z);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ret = SVGA3D_BeginSurfaceCopy(svga->swc,
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &src.base,
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &dst.base,
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 &boxes, 1);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ret != PIPE_OK) {
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga_context_flush(svga, NULL);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret = SVGA3D_BeginSurfaceCopy(svga->swc,
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    &src.base,
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    &dst.base,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    &boxes, 1);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(ret == PIPE_OK);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *boxes = box;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA_FIFOCommitAll(svga->swc);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct svga_winsys_surface *
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_texture_view_surface(struct svga_context *svga,
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct svga_texture *tex,
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          SVGA3dSurfaceFlags flags,
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          SVGA3dSurfaceFormat format,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          unsigned start_mip,
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          unsigned num_mip,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          int face_pick,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          int zslice_pick,
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          struct svga_host_surface_cache_key *key) /* OUT */
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_screen *ss = svga_screen(svga->pipe.screen);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_winsys_surface *handle;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t i, j;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned z_offset = 0;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA_DBG(DEBUG_PERF,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            "svga: Create surface view: face %d zslice %d mips %d..%d\n",
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            face_pick, zslice_pick, start_mip, start_mip+num_mip-1);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->flags = flags;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->format = format;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->numMipLevels = num_mip;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->size.width = u_minify(tex->b.b.width0, start_mip);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->size.height = u_minify(tex->b.b.height0, start_mip);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->size.depth = zslice_pick < 0 ? u_minify(tex->b.b.depth0, start_mip) : 1;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   key->cachable = 1;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(key->size.depth == 1);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tex->b.b.target == PIPE_TEXTURE_CUBE && face_pick < 0) {
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->flags |= SVGA3D_SURFACE_CUBEMAP;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->numFaces = 6;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->numFaces = 1;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (key->format == SVGA3D_FORMAT_INVALID) {
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->cachable = 0;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA_DBG(DEBUG_DMA, "surface_create for texture view\n");
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   handle = svga_screen_surface_create(ss, key);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!handle) {
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key->cachable = 0;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA_DBG(DEBUG_DMA, " --> got sid %p (texture view)\n", handle);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (face_pick < 0)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      face_pick = 0;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (zslice_pick >= 0)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      z_offset = zslice_pick;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < key->numMipLevels; i++) {
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < key->numFaces; j++) {
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (tex->defined[j + face_pick][i + start_mip]) {
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            unsigned depth = (zslice_pick < 0 ?
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              u_minify(tex->b.b.depth0, i + start_mip) :
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              1);
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            svga_texture_copy_handle(svga,
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     tex->handle,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     0, 0, z_offset,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     i + start_mip,
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     j + face_pick,
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     handle, 0, 0, 0, i, j,
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     u_minify(tex->b.b.width0, i + start_mip),
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     u_minify(tex->b.b.height0, i + start_mip),
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     depth);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return handle;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pipe_surface *
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_create_surface(struct pipe_context *pipe,
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    struct pipe_resource *pt,
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    const struct pipe_surface *surf_tmpl)
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_context *svga = svga_context(pipe);
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_texture *tex = svga_texture(pt);
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *screen = pipe->screen;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_screen *ss = svga_screen(screen);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_surface *s;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned face, zslice;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX surfaces should only be used for rendering purposes nowadays */
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean render = (surf_tmpl->usage & (PIPE_BIND_RENDER_TARGET |
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                         PIPE_BIND_DEPTH_STENCIL)) ? TRUE : FALSE;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean view = FALSE;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA3dSurfaceFlags flags;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVGA3dSurfaceFormat format;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s = CALLOC_STRUCT(svga_surface);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!s)
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pt->target == PIPE_TEXTURE_CUBE) {
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      face = surf_tmpl->u.tex.first_layer;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zslice = 0;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      face = 0;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zslice = surf_tmpl->u.tex.first_layer;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_reference_init(&s->base.reference, 1);
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&s->base.texture, pt);
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.context = pipe;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.format = surf_tmpl->format;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.width = u_minify(pt->width0, surf_tmpl->u.tex.level);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.height = u_minify(pt->height0, surf_tmpl->u.tex.level);
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.usage = surf_tmpl->usage;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.u.tex.level = surf_tmpl->u.tex.level;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.u.tex.first_layer = surf_tmpl->u.tex.first_layer;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->base.u.tex.last_layer = surf_tmpl->u.tex.last_layer;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!render) {
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      flags = SVGA3D_SURFACE_HINT_TEXTURE;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (surf_tmpl->usage & PIPE_BIND_RENDER_TARGET) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         flags = SVGA3D_SURFACE_HINT_RENDERTARGET;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (surf_tmpl->usage & PIPE_BIND_DEPTH_STENCIL) {
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         flags = SVGA3D_SURFACE_HINT_DEPTHSTENCIL;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   format = svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(format != SVGA3D_FORMAT_INVALID);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (svga_screen(screen)->debug.force_surface_view)
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view = TRUE;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Currently only used for compressed textures */
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (render &&
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       format != svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage)) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view = TRUE;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surf_tmpl->u.tex.level != 0 &&
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       svga_screen(screen)->debug.force_level_surface_view)
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view = TRUE;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pt->target == PIPE_TEXTURE_3D)
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view = TRUE;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (svga_screen(screen)->debug.no_surface_view)
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      view = FALSE;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (view) {
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SVGA_DBG(DEBUG_VIEWS, "svga: Surface view: yes %p, level %u face %u z %u, %p\n",
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               pt, surf_tmpl->u.tex.level, face, zslice, s);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->handle = svga_texture_view_surface(svga, tex, flags, format,
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            surf_tmpl->u.tex.level,
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            1, face, zslice, &s->key);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->real_face = 0;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->real_level = 0;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->real_zslice = 0;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SVGA_DBG(DEBUG_VIEWS, "svga: Surface view: no %p, level %u, face %u, z %u, %p\n",
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               pt, surf_tmpl->u.tex.level, face, zslice, s);
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memset(&s->key, 0, sizeof s->key);
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->handle = tex->handle;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->real_face = face;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->real_zslice = zslice;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->real_level = surf_tmpl->u.tex.level;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &s->base;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_surface_destroy(struct pipe_context *pipe,
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     struct pipe_surface *surf)
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_surface *s = svga_surface(surf);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_texture *t = svga_texture(surf->texture);
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_screen *ss = svga_screen(surf->texture->screen);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (s->handle != t->handle) {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SVGA_DBG(DEBUG_DMA, "unref sid %p (tex surface)\n", s->handle);
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga_screen_surface_destroy(ss, &s->key, &s->handle);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&surf->texture, NULL);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(surf);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE void
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_mark_surface_dirty(struct pipe_surface *surf)
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_surface *s = svga_surface(surf);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!s->dirty) {
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct svga_texture *tex = svga_texture(surf->texture);
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s->dirty = TRUE;
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (s->handle == tex->handle) {
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* hmm so 3d textures always have all their slices marked ? */
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (surf->texture->target == PIPE_TEXTURE_CUBE)
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            tex->defined[surf->u.tex.first_layer][surf->u.tex.level] = TRUE;
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            tex->defined[0][surf->u.tex.level] = TRUE;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* this will happen later in svga_propagate_surface */
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Increment the view_age and texture age for this surface's slice
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * so that any sampler views into the texture are re-validated too.
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tex->view_age[surf->u.tex.first_layer] = ++(tex->age);
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_mark_surfaces_dirty(struct svga_context *svga)
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (svga->curr.framebuffer.cbufs[i])
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         svga_mark_surface_dirty(svga->curr.framebuffer.cbufs[i]);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (svga->curr.framebuffer.zsbuf)
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga_mark_surface_dirty(svga->curr.framebuffer.zsbuf);
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Progagate any changes from surfaces to texture.
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pipe is optional context to inline the blit command in.
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_propagate_surface(struct svga_context *svga, struct pipe_surface *surf)
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_surface *s = svga_surface(surf);
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_texture *tex = svga_texture(surf->texture);
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_screen *ss = svga_screen(surf->texture->screen);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned zslice, face;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!s->dirty)
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (surf->texture->target == PIPE_TEXTURE_CUBE) {
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zslice = 0;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      face = surf->u.tex.first_layer;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zslice = surf->u.tex.first_layer;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      face = 0;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   s->dirty = FALSE;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ss->texture_timestamp++;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tex->view_age[surf->u.tex.level] = ++(tex->age);
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (s->handle != tex->handle) {
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      SVGA_DBG(DEBUG_VIEWS,
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               "svga: Surface propagate: tex %p, level %u, from %p\n",
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               tex, surf->u.tex.level, surf);
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      svga_texture_copy_handle(svga,
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               s->handle, 0, 0, 0, s->real_level, s->real_face,
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               tex->handle, 0, 0, zslice, surf->u.tex.level, face,
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               u_minify(tex->b.b.width0, surf->u.tex.level),
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               u_minify(tex->b.b.height0, surf->u.tex.level), 1);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tex->defined[face][surf->u.tex.level] = TRUE;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if we should call svga_propagate_surface on the surface.
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_surface_needs_propagation(const struct pipe_surface *surf)
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct svga_surface *s = svga_surface_const(surf);
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct svga_texture *tex = svga_texture(surf->texture);
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return s->dirty && s->handle != tex->handle;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsvga_init_surface_functions(struct svga_context *svga)
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->pipe.create_surface = svga_create_surface;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   svga->pipe.surface_destroy = svga_surface_destroy;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
408