Module: Mesa
Branch: gallium-array-textures
Commit: f7a202fde2aea2ec78ef58830f945a5e214e56ab
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f7a202fde2aea2ec78ef58830f945a5e214e56ab

Author: Roland Scheidegger <[email protected]>
Date:   Wed Nov 24 19:19:32 2010 +0100

gallium: even more fixes/cleanups after merge

---

 src/gallium/auxiliary/util/u_surfaces.c            |    8 +-
 src/gallium/auxiliary/util/u_surfaces.h            |   10 +-
 src/gallium/drivers/nvfx/nvfx_miptree.c            |    2 +-
 src/gallium/drivers/nvfx/nvfx_surface.c            |    2 +-
 src/gallium/drivers/softpipe/sp_texture.c          |    2 +-
 src/gallium/include/pipe/p_defines.h               |    6 +-
 .../state_trackers/d3d1x/dxgi/src/dxgi_native.cpp  |   23 ++++--
 .../state_trackers/d3d1x/gd3d11/d3d11_context.h    |   95 +++++++++++---------
 .../state_trackers/d3d1x/gd3d11/d3d11_screen.h     |   72 +++++++--------
 9 files changed, 119 insertions(+), 101 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_surfaces.c 
b/src/gallium/auxiliary/util/u_surfaces.c
index a8a7635..45aa15e 100644
--- a/src/gallium/auxiliary/util/u_surfaces.c
+++ b/src/gallium/auxiliary/util/u_surfaces.c
@@ -32,7 +32,7 @@
 struct pipe_surface *
 util_surfaces_do_get(struct util_surfaces *us, unsigned surface_struct_size,
                      struct pipe_screen *pscreen, struct pipe_resource *pt,
-                     unsigned face, unsigned level, unsigned zslice, unsigned 
flags)
+                     unsigned level, unsigned layer, unsigned flags)
 {
    struct pipe_surface *ps;
 
@@ -41,7 +41,7 @@ util_surfaces_do_get(struct util_surfaces *us, unsigned 
surface_struct_size,
       if(!us->u.hash)
          us->u.hash = cso_hash_create();
 
-      ps = cso_hash_iter_data(cso_hash_find(us->u.hash, ((zslice + face) << 8) 
| level));
+      ps = cso_hash_iter_data(cso_hash_find(us->u.hash, (layer << 8) | level));
    }
    else
    {
@@ -60,10 +60,10 @@ util_surfaces_do_get(struct util_surfaces *us, unsigned 
surface_struct_size,
    if(!ps)
       return NULL;
 
-   pipe_surface_init(ps, pt, level, zslice + face, flags);
+   pipe_surface_init(ps, pt, level, layer, flags);
 
    if(pt->target == PIPE_TEXTURE_3D || pt->target == PIPE_TEXTURE_CUBE)
-      cso_hash_insert(us->u.hash, ((zslice + face) << 8) | level, ps);
+      cso_hash_insert(us->u.hash, (layer << 8) | level, ps);
    else
       us->u.array[level] = ps;
 
diff --git a/src/gallium/auxiliary/util/u_surfaces.h 
b/src/gallium/auxiliary/util/u_surfaces.h
index 92c4efc..86a1c2f 100644
--- a/src/gallium/auxiliary/util/u_surfaces.h
+++ b/src/gallium/auxiliary/util/u_surfaces.h
@@ -42,11 +42,11 @@ struct util_surfaces
    } u;
 };
 
-struct pipe_surface *util_surfaces_do_get(struct util_surfaces *us, unsigned 
surface_struct_size, struct pipe_screen *pscreen, struct pipe_resource *pt, 
unsigned face, unsigned level, unsigned zslice, unsigned flags);
+struct pipe_surface *util_surfaces_do_get(struct util_surfaces *us, unsigned 
surface_struct_size, struct pipe_screen *pscreen, struct pipe_resource *pt, 
unsigned level, unsigned layer, unsigned flags);
 
 /* fast inline path for the very common case */
 static INLINE struct pipe_surface *
-util_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size, 
struct pipe_screen *pscreen, struct pipe_resource *pt, unsigned face, unsigned 
level, unsigned zslice, unsigned flags)
+util_surfaces_get(struct util_surfaces *us, unsigned surface_struct_size, 
struct pipe_screen *pscreen, struct pipe_resource *pt, unsigned level, unsigned 
layer, unsigned flags)
 {
    if(likely((pt->target == PIPE_TEXTURE_2D || pt->target == 
PIPE_TEXTURE_RECT) && us->u.array))
    {
@@ -58,17 +58,17 @@ util_surfaces_get(struct util_surfaces *us, unsigned 
surface_struct_size, struct
       }
    }
 
-   return util_surfaces_do_get(us, surface_struct_size, pscreen, pt, face, 
level, zslice, flags);
+   return util_surfaces_do_get(us, surface_struct_size, pscreen, pt, level, 
layer, flags);
 }
 
 static INLINE struct pipe_surface *
-util_surfaces_peek(struct util_surfaces *us, struct pipe_resource *pt, 
unsigned face, unsigned level, unsigned zslice)
+util_surfaces_peek(struct util_surfaces *us, struct pipe_resource *pt, 
unsigned level, unsigned layer)
 {
    if(!us->u.pv)
       return 0;
 
    if(unlikely(pt->target == PIPE_TEXTURE_3D || pt->target == 
PIPE_TEXTURE_CUBE))
-      return cso_hash_iter_data(cso_hash_find(us->u.hash, ((zslice + face) << 
8) | level));
+      return cso_hash_iter_data(cso_hash_find(us->u.hash, (layer << 8) | 
level));
    else
       return us->u.array[level];
 }
diff --git a/src/gallium/drivers/nvfx/nvfx_miptree.c 
b/src/gallium/drivers/nvfx/nvfx_miptree.c
index 15fa181..db48025 100644
--- a/src/gallium/drivers/nvfx/nvfx_miptree.c
+++ b/src/gallium/drivers/nvfx/nvfx_miptree.c
@@ -199,7 +199,7 @@ nvfx_miptree_surface_new(struct pipe_context *pipe, struct 
pipe_resource *pt,
 
        assert(surf_tmpl->u.tex.first_layer == surf_tmpl->u.tex.last_layer);
        ns = (struct nvfx_surface*)util_surfaces_get(&mt->surfaces, 
sizeof(struct nvfx_surface), NULL, pt,
-                                                    0, level, 
surf_tmpl->u.tex.first_layer, surf_tmpl->usage);
+                                                    level, 
surf_tmpl->u.tex.first_layer, surf_tmpl->usage);
        if(ns->offset == ~0) {
                util_dirty_surface_init(&ns->base);
                ns->pitch = nvfx_subresource_pitch(pt, level);
diff --git a/src/gallium/drivers/nvfx/nvfx_surface.c 
b/src/gallium/drivers/nvfx/nvfx_surface.c
index c4d2cfd..7f315e9 100644
--- a/src/gallium/drivers/nvfx/nvfx_surface.c
+++ b/src/gallium/drivers/nvfx/nvfx_surface.c
@@ -123,7 +123,7 @@ nvfx_region_init_for_subresource(struct nv04_region* rgn, 
struct pipe_resource*
 {
        if(pt->target != PIPE_BUFFER)
        {
-               struct nvfx_surface* ns = (struct 
nvfx_surface*)util_surfaces_peek(&((struct nvfx_miptree*)pt)->surfaces, pt, 0, 
level, z);
+               struct nvfx_surface* ns = (struct 
nvfx_surface*)util_surfaces_peek(&((struct nvfx_miptree*)pt)->surfaces, pt, 
level, z);
                if(ns && util_dirty_surface_is_dirty(&ns->base))
                {
                        nvfx_region_init_for_surface(rgn, ns, x, y, for_write);
diff --git a/src/gallium/drivers/softpipe/sp_texture.c 
b/src/gallium/drivers/softpipe/sp_texture.c
index e1c2983..509d998 100644
--- a/src/gallium/drivers/softpipe/sp_texture.c
+++ b/src/gallium/drivers/softpipe/sp_texture.c
@@ -271,7 +271,7 @@ softpipe_create_surface(struct pipe_context *pipe,
 
 
 /**
- * Free a pipe_surface which was created with softpipe_get_tex_surface().
+ * Free a pipe_surface which was created with softpipe_create_surface().
  */
 static void 
 softpipe_surface_destroy(struct pipe_context *pipe,
diff --git a/src/gallium/include/pipe/p_defines.h 
b/src/gallium/include/pipe/p_defines.h
index 1a1ffbc..812ad66 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -275,9 +275,9 @@ enum pipe_transfer_usage {
  * Resource binding flags -- state tracker must specify in advance all
  * the ways a resource might be used.
  */
-#define PIPE_BIND_DEPTH_STENCIL        (1 << 0) /* get_tex_surface */
-#define PIPE_BIND_RENDER_TARGET        (1 << 1) /* get_tex_surface */
-#define PIPE_BIND_SAMPLER_VIEW         (1 << 2) /* get_sampler_view */
+#define PIPE_BIND_DEPTH_STENCIL        (1 << 0) /* create_surface */
+#define PIPE_BIND_RENDER_TARGET        (1 << 1) /* create_surface */
+#define PIPE_BIND_SAMPLER_VIEW         (1 << 2) /* create_sampler_view */
 #define PIPE_BIND_VERTEX_BUFFER        (1 << 3) /* set_vertex_buffers */
 #define PIPE_BIND_INDEX_BUFFER         (1 << 4) /* draw_elements */
 #define PIPE_BIND_CONSTANT_BUFFER      (1 << 5) /* set_constant_buffer */
diff --git a/src/gallium/state_trackers/d3d1x/dxgi/src/dxgi_native.cpp 
b/src/gallium/state_trackers/d3d1x/dxgi/src/dxgi_native.cpp
index c246fc5..a54324a 100644
--- a/src/gallium/state_trackers/d3d1x/dxgi/src/dxgi_native.cpp
+++ b/src/gallium/state_trackers/d3d1x/dxgi/src/dxgi_native.cpp
@@ -1159,8 +1159,15 @@ struct GalliumDXGISwapChain : public 
GalliumDXGIObject<IDXGISwapChain, GalliumDX
                        unsigned blit_x, blit_y, blit_w, blit_h;
                        float black[4] = {0, 0, 0, 0};
 
-                       if(!formats_compatible || src->width0 != dst_w || 
src->height0 != dst_h)
-                               dst_surface = 
pipe->screen->get_tex_surface(pipe->screen, dst, 0, 0, 0, 
PIPE_BIND_RENDER_TARGET);
+                       if(!formats_compatible || src->width0 != dst_w || 
src->height0 != dst_h) {
+                               struct pipe_surface templat;
+                               templat.usage = PIPE_BIND_RENDER_TARGET;
+                               templat.format = dst->format;
+                               templat.u.tex.level = 0;
+                               templat.u.tex.first_layer = 0;
+                               templat.u.tex.last_layer = 0;
+                               dst_surface = pipe->create_surface(pipe, dst, 
&templat);
+                       }
 
                        if(preserve_aspect_ratio)
                        {
@@ -1199,10 +1206,12 @@ struct GalliumDXGISwapChain : public 
GalliumDXGIObject<IDXGISwapChain, GalliumDX
 
                        if(formats_compatible && blit_w == src->width0 && 
blit_h == src->height0)
                        {
-                               pipe_subresource sr;
-                               sr.face = 0;
-                               sr.level = 0;
-                               pipe->resource_copy_region(pipe, dst, sr, 
rect.left, rect.top, 0, src, sr, 0, 0, 0, blit_w, blit_h);
+                               pipe_box box;
+                               box.x = box.y = box.z;
+                               box.width = blit_w;
+                               box.height = blit_h;
+                               box.z = 1;
+                               pipe->resource_copy_region(pipe, dst, 0, 
rect.left, rect.top, 0, src, 0, &box);
                        }
                        else
                        {
@@ -1218,7 +1227,7 @@ struct GalliumDXGISwapChain : public 
GalliumDXGIObject<IDXGISwapChain, GalliumDX
                }
 
                if(dst_surface)
-                       pipe->screen->tex_surface_destroy(dst_surface);
+                       pipe->surface_destroy(pipe, dst_surface);
 
                pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE | PIPE_FLUSH_FRAME, 
0);
 
diff --git a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h 
b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h
index 3611059..e1ba6c1 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h
+++ b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h
@@ -1416,23 +1416,33 @@ changed:
                        *out_predicate_value = render_predicate_value;
        }
 
-       static pipe_subresource d3d11_to_pipe_subresource(struct pipe_resource* 
resource, unsigned subresource)
+       static unsigned d3d11_subresource_to_level(struct pipe_resource* 
resource, unsigned subresource)
        {
-               pipe_subresource sr;
                if(subresource <= resource->last_level)
                {
-                       sr.level = subresource;
-                       sr.face = 0;
+                       return subresource;
                }
                else
                {
                        unsigned levels = resource->last_level + 1;
-                       sr.level = subresource % levels;
-                       sr.face = subresource / levels;
+                       return subresource % levels;
                }
-               return sr;
        }
 
+       static unsigned d3d11_subresource_to_face(struct pipe_resource* 
resource, unsigned subresource)
+       {
+               if(subresource <= resource->last_level)
+               {
+                       return 0;
+               }
+               else
+               {
+                       unsigned levels = resource->last_level + 1;
+                       return subresource / levels;
+               }
+       }
+               
+       
        /* TODO: deferred contexts will need a different implementation of this,
         * because we can't put the transfer info into the resource itself.
         * Also, there are very different restrictions, for obvious reasons.
@@ -1448,8 +1458,10 @@ changed:
                GalliumD3D11Resource<>* resource = 
(GalliumD3D11Resource<>*)iresource;
                if(resource->transfers.count(subresource))
                        return E_FAIL;
-               pipe_subresource sr = 
d3d11_to_pipe_subresource(resource->resource, subresource);
-               pipe_box box = d3d11_to_pipe_box(resource->resource, sr.level, 
0);
+               unsigned level = d3d11_subresource_to_level(resource->resource, 
subresource);
+               unsigned face = d3d11_subresource_to_face(resource->resource, 
subresource);
+               pipe_box box = d3d11_to_pipe_box(resource->resource, level, 0);
+               /* XXX the translation from subresource to 
level/face(zslice/array layer) isn't quite right */
                unsigned usage = 0;
                if(map_type == D3D11_MAP_READ)
                        usage = PIPE_TRANSFER_READ;
@@ -1465,7 +1477,7 @@ changed:
                        return E_INVALIDARG;
                if(map_type & D3D10_MAP_FLAG_DO_NOT_WAIT)
                        usage |= PIPE_TRANSFER_DONTBLOCK;
-               struct pipe_transfer* transfer = pipe->get_transfer(pipe, 
resource->resource, sr, usage, &box);
+               struct pipe_transfer* transfer = pipe->get_transfer(pipe, 
resource->resource, level, usage, &box);
                if(!transfer) {
                        if(map_type & D3D10_MAP_FLAG_DO_NOT_WAIT)
                                return DXGI_ERROR_WAS_STILL_DRAWING;
@@ -1475,7 +1487,7 @@ changed:
                resource->transfers[subresource] = transfer;
                mapped_resource->pData = pipe->transfer_map(pipe, transfer);
                mapped_resource->RowPitch = transfer->stride;
-               mapped_resource->DepthPitch = transfer->slice_stride;
+               mapped_resource->DepthPitch = transfer->layer_stride;
                return S_OK;
        }
 
@@ -1507,15 +1519,16 @@ changed:
                SYNCHRONIZED;
                GalliumD3D11Resource<>* dst = 
(GalliumD3D11Resource<>*)dst_resource;
                GalliumD3D11Resource<>* src = 
(GalliumD3D11Resource<>*)src_resource;
-               pipe_subresource subdst = 
d3d11_to_pipe_subresource(dst->resource, dst_subresource);
-               pipe_subresource subsrc = 
d3d11_to_pipe_subresource(src->resource, src_subresource);
-               pipe_box box = d3d11_to_pipe_box(src->resource, subsrc.level, 
src_box);
-               for(unsigned i = 0; i < box.depth; ++i)
+               unsigned dst_level = d3d11_subresource_to_level(dst->resource, 
dst_subresource);
+               unsigned dst_face = d3d11_subresource_to_face(dst->resource, 
dst_subresource);
+               unsigned src_level = d3d11_subresource_to_level(src->resource, 
src_subresource);
+               unsigned src_face = d3d11_subresource_to_face(src->resource, 
src_subresource);
+               /* XXX the translation from subresource to 
level/face(zslice/array layer) isn't quite right */
+               pipe_box box = d3d11_to_pipe_box(src->resource, src_level, 
src_box);
                {
                        pipe->resource_copy_region(pipe,
-                               dst->resource, subdst, dst_x, dst_y, dst_z + i,
-                               src->resource, subsrc, box.x, box.y, box.z + i,
-                               box.width, box.height);
+                               dst->resource, dst_level, dst_x, dst_y, dst_z,
+                               src->resource, src_level, &box);
                }
        }
 
@@ -1526,24 +1539,23 @@ changed:
                SYNCHRONIZED;
                GalliumD3D11Resource<>* dst = 
(GalliumD3D11Resource<>*)dst_resource;
                GalliumD3D11Resource<>* src = 
(GalliumD3D11Resource<>*)src_resource;
-               pipe_subresource sr;
-               unsigned faces = dst->resource->target == PIPE_TEXTURE_CUBE ? 6 
: 1;
-
-               for(sr.face = 0; sr.face < faces; ++sr.face)
+               unsigned level;
+               for(level = 0; level <= dst->resource->last_level; ++level)
                {
-                       for(sr.level = 0; sr.level <= 
dst->resource->last_level; ++sr.level)
-                       {
-                               unsigned w = u_minify(dst->resource->width0, 
sr.level);
-                               unsigned h = u_minify(dst->resource->height0, 
sr.level);
-                               unsigned d = u_minify(dst->resource->depth0, 
sr.level);
-                               for(unsigned i = 0; i < d; ++i)
-                               {
-                                       pipe->resource_copy_region(pipe,
-                                                       dst->resource, sr, 0, 
0, i,
-                                                       src->resource, sr, 0, 
0, i,
-                                                       w, h);
-                               }
-                       }
+                       unsigned layers = 1;
+                       pipe_box box;
+                       if (dst->resource->target == PIPE_TEXTURE_CUBE)
+                               layers = 6;
+                       else if (dst->resource->target == PIPE_TEXTURE_3D)
+                               layers = u_minify(dst->resource->depth0, level);
+                       /* else layers = dst->resource->array_size; */
+                       box.x = box.y = box.z = 0;
+                       box.width = u_minify(dst->resource->width0, level);
+                       box.height = u_minify(dst->resource->height0, level);
+                       box.depth = layers;
+                       pipe->resource_copy_region(pipe,
+                                                  dst->resource, level, 0, 0, 
0,
+                                                  src->resource, level, &box);
                }
        }
 
@@ -1557,9 +1569,10 @@ changed:
        {
                SYNCHRONIZED;
                GalliumD3D11Resource<>* dst = 
(GalliumD3D11Resource<>*)dst_resource;
-               pipe_subresource subdst = 
d3d11_to_pipe_subresource(dst->resource, dst_subresource);
-               pipe_box box = d3d11_to_pipe_box(dst->resource, subdst.level, 
pDstBox);
-               pipe->transfer_inline_write(pipe, dst->resource, subdst, 
PIPE_TRANSFER_WRITE, &box, pSrcData, src_row_pitch, src_depth_pitch);
+               unsigned dst_level = d3d11_subresource_to_level(dst->resource, 
dst_subresource);
+               /* XXX the translation from subresource to 
level/face(zslice/array layer) isn't quite right */
+               pipe_box box = d3d11_to_pipe_box(dst->resource, dst_level, 
pDstBox);
+               pipe->transfer_inline_write(pipe, dst->resource, dst_level, 
PIPE_TRANSFER_WRITE, &box, pSrcData, src_row_pitch, src_depth_pitch);
        }
 
 #if API >= 11
@@ -1714,9 +1727,9 @@ changed:
                SYNCHRONIZED;
                GalliumD3D11Resource<>* dst = 
(GalliumD3D11Resource<>*)dst_resource;
                GalliumD3D11Resource<>* src = 
(GalliumD3D11Resource<>*)src_resource;
-               pipe_subresource subdst = 
d3d11_to_pipe_subresource(dst->resource, dst_subresource);
-               pipe_subresource subsrc = 
d3d11_to_pipe_subresource(src->resource, src_subresource);
-               pipe->resource_resolve(pipe, dst->resource, subdst, 
src->resource, subsrc);
+               unsigned dst_layer = d3d11_subresource_to_face(dst->resource, 
dst_subresource);
+               unsigned src_layer = d3d11_subresource_to_face(src->resource, 
src_subresource);
+               pipe->resource_resolve(pipe, dst->resource, dst_layer, 
src->resource, src_layer);
        }
 
 #if API >= 11
diff --git a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h 
b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
index 95ea4e0..9cfdc83 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
+++ b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
@@ -718,15 +718,13 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                        {
                                for(unsigned level = 0; level <= 
templat.last_level; ++level)
                                {
-                                       struct pipe_subresource sr;
-                                       sr.level = level;
-                                       sr.face = slice;
                                        struct pipe_box box;
-                                       box.x = box.y = box.z = 0;
+                                       box.x = box.y = 0;
+                                       box.z = slice;
                                        box.width = u_minify(width, level);
                                        box.height = u_minify(height, level);
-                                       box.depth = u_minify(depth, level);
-                                       
immediate_pipe->transfer_inline_write(immediate_pipe, resource, sr, 
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | PIPE_TRANSFER_UNSYNCHRONIZED, 
&box, initial_data->pSysMem, initial_data->SysMemPitch, 
initial_data->SysMemSlicePitch);
+                                       box.depth = 1;
+                                       
immediate_pipe->transfer_inline_write(immediate_pipe, resource, level, 
PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | PIPE_TRANSFER_UNSYNCHRONIZED, 
&box, initial_data->pSysMem, initial_data->SysMemPitch, 
initial_data->SysMemSlicePitch);
                                        ++initial_data;
                                }
                        }
@@ -978,8 +976,8 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
                case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
                        /* yes, this works for all of these types (but TODO: 
texture arrays) */
-                       templat.first_level = desc->Texture1D.MostDetailedMip;
-                       templat.last_level = templat.first_level + 
desc->Texture1D.MipLevels - 1;
+                       templat.u.tex.first_level = 
desc->Texture1D.MostDetailedMip;
+                       templat.u.tex.last_level = templat.u.tex.first_level + 
desc->Texture1D.MipLevels - 1;
                        break;
                case D3D11_SRV_DIMENSION_BUFFER:
                case D3D11_SRV_DIMENSION_TEXTURE2DMS:
@@ -1054,30 +1052,34 @@ struct GalliumD3D11ScreenImpl : public 
GalliumD3D11Screen
                        desc = &def_desc;
                }
 
-               unsigned zslice = 0;
-               unsigned face = 0;
-               unsigned level;
-               enum pipe_format format;
+               struct pipe_surface templat;
+               memset(&templat, 0, sizeof(templat));
                if(invalid(desc->format >= DXGI_FORMAT_COUNT))
                        return E_INVALIDARG;
-               format = dxgi_to_pipe_format[desc->Format];
-               if(!format)
+               templat.format = dxgi_to_pipe_format[desc->Format];
+               if(!templat.format)
                        return E_NOTIMPL;
+               templat.usage = PIPE_BIND_RENDER_TARGET;
+               templat.texture = 
((GalliumD3D11Resource<>*)iresource)->resource;
 
                switch(desc->ViewDimension)
                {
                case D3D11_RTV_DIMENSION_TEXTURE1D:
                case D3D11_RTV_DIMENSION_TEXTURE2D:
-                       level = desc->Texture1D.MipSlice;
+                       templat.u.tex.level = desc->Texture1D.MipSlice;
                        break;
                case D3D11_RTV_DIMENSION_TEXTURE3D:
-                       level = desc->Texture3D.MipSlice;
-                       zslice = desc->Texture3D.FirstWSlice;
+                       templat.u.tex.level = desc->Texture3D.MipSlice;
+                       templat.u.tex.first_layer = desc->Texture3D.FirstWSlice;
+                       /* XXX FIXME */
+                       templat.u.tex.last_layer = desc->Texture3D.FirstWSlice;
                        break;
                case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:
                case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:
-                       level = desc->Texture1DArray.MipSlice;
-                       face = desc->Texture1DArray.FirstArraySlice;
+                       templat.u.tex.level = desc->Texture1DArray.MipSlice;
+                       templat.u.tex.first_layer = 
desc->Texture1DArray.FirstArraySlice;
+                       /* XXX FIXME */
+                       templat.u.tex.last_layer = 
desc->Texture1DArray.FirstArraySlice;
                        break;
                case D3D11_RTV_DIMENSION_BUFFER:
                case D3D11_RTV_DIMENSION_TEXTURE2DMS:
@@ -1090,13 +1092,9 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                if(!out_rtv)
                        return S_FALSE;
 
-               struct pipe_surface* surface = screen->get_tex_surface(screen,
-                               ((GalliumD3D11Resource<>*)iresource)->resource,
-                               face, level, zslice, PIPE_BIND_RENDER_TARGET);
+               struct pipe_surface* surface = 
immediate_pipe->create_surface(immediate_pipe, templat.texture, &templat);
                if(!surface)
                        return E_FAIL;
-               /* muhahahahaha, let's hope this actually works */
-               surface->format = format;
                *out_rtv = new GalliumD3D11RenderTargetView(this, 
(GalliumD3D11Resource<>*)iresource, surface, *desc);
                return S_OK;
        }
@@ -1134,26 +1132,28 @@ struct GalliumD3D11ScreenImpl : public 
GalliumD3D11Screen
                        desc = &def_desc;
                }
 
-               unsigned zslice = 0;
-               unsigned face = 0;
-               unsigned level;
-               enum pipe_format format;
+               struct pipe_surface templat;
+               memset(&templat, 0, sizeof(templat));
                if(invalid(desc->format >= DXGI_FORMAT_COUNT))
                        return E_INVALIDARG;
-               format = dxgi_to_pipe_format[desc->Format];
-               if(!format)
+               templat.format = dxgi_to_pipe_format[desc->Format];
+               if(!templat.format)
                        return E_NOTIMPL;
+               templat.usage = PIPE_BIND_DEPTH_STENCIL;
+               templat.texture = 
((GalliumD3D11Resource<>*)iresource)->resource;
 
                switch(desc->ViewDimension)
                {
                case D3D11_DSV_DIMENSION_TEXTURE1D:
                case D3D11_DSV_DIMENSION_TEXTURE2D:
-                       level = desc->Texture1D.MipSlice;
+                       templat.u.tex.level = desc->Texture1D.MipSlice;
                        break;
                case D3D11_DSV_DIMENSION_TEXTURE1DARRAY:
                case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:
-                       level = desc->Texture1DArray.MipSlice;
-                       face = desc->Texture1DArray.FirstArraySlice;
+                       templat.u.tex.level = desc->Texture1DArray.MipSlice;
+                       templat.u.tex.first_layer = 
desc->Texture1DArray.FirstArraySlice;
+                       /* XXX FIXME */
+                       templat.u.tex.last_layer = 
desc->Texture1DArray.FirstArraySlice;
                        break;
                case D3D11_DSV_DIMENSION_TEXTURE2DMS:
                case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:
@@ -1165,13 +1165,9 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                if(!out_depth_stencil_view)
                        return S_FALSE;
 
-               struct pipe_surface* surface = screen->get_tex_surface(screen,
-                               ((GalliumD3D11Resource<>*)iresource)->resource,
-                               face, level, zslice, PIPE_BIND_DEPTH_STENCIL);
+               struct pipe_surface* surface = 
immediate_pipe->create_surface(immediate_pipe, templat.texture, &templat);
                if(!surface)
                        return E_FAIL;
-               /* muhahahahaha, let's hope this actually works */
-               surface->format = format;
                *out_depth_stencil_view = new 
GalliumD3D11DepthStencilView(this, (GalliumD3D11Resource<>*)iresource, surface, 
*desc);
                return S_OK;
        }

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to