Mesa (gallium-array-textures): gallium: even more fixes/ cleanups after merge

Roland Scheidegger sroland at kemper.freedesktop.org
Wed Nov 24 18:20:06 UTC 2010


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

Author: Roland Scheidegger <sroland at vmware.com>
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;
 	}




More information about the mesa-commit mailing list