Mesa (master): d3d1x: properly support specifying MipLevels as 0

Luca Barbieri lb at kemper.freedesktop.org
Mon Sep 27 20:28:44 UTC 2010


Module: Mesa
Branch: master
Commit: b821fdd563d2a46f11f956fab049f6807fcdbf7f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b821fdd563d2a46f11f956fab049f6807fcdbf7f

Author: Luca Barbieri <luca at luca-barbieri.com>
Date:   Mon Sep 27 18:25:41 2010 +0200

d3d1x: properly support specifying MipLevels as 0

---

 .../state_trackers/d3d1x/gd3d11/d3d11_screen.h     |   21 ++++++++++++++-----
 1 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
index b7c6a44..9852daf 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
+++ b/src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
@@ -684,7 +684,10 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
 		templat.width0 = width;
 		templat.height0 = height;
 		templat.depth0 = depth;
-		templat.last_level = mip_levels ? (mip_levels - 1) : 0;
+		if(mip_levels)
+			templat.last_level = mip_levels - 1;
+		else
+			templat.last_level = MAX2(MAX2(util_logbase2(templat.width0), util_logbase2(templat.height0)), util_logbase2(templat.depth0));
 		templat.format = dxgi_to_pipe_format[format];
 		templat.bind = d3d11_to_pipe_bind_flags(bind_flags);
 		if(c_p_u_access_flags & D3D11_CPU_ACCESS_READ)
@@ -758,7 +761,9 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
 		HRESULT hr = create_resource(PIPE_TEXTURE_1D, desc->Width, 1, 1, desc->MipLevels, desc->ArraySize, desc->Format, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture1d ? &resource : 0);
 		if(hr != S_OK)
 			return hr;
-		*out_texture1d = new GalliumD3D11Texture1D(this, resource, *desc, dxgi_usage);
+		D3D11_TEXTURE1D_DESC cdesc = *desc;
+		cdesc.MipLevels = resource->last_level + 1;
+		*out_texture1d = new GalliumD3D11Texture1D(this, resource, cdesc, dxgi_usage);
 		return S_OK;
 	}
 
@@ -774,10 +779,12 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
 		HRESULT hr = create_resource(PIPE_TEXTURE_2D, desc->Width, desc->Height, 1, desc->MipLevels, desc->ArraySize, desc->Format, &desc->SampleDesc, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture2d ? &resource : 0);
 		if(hr != S_OK)
 			return hr;
-		if(desc->MipLevels == 1 && desc->ArraySize == 1)
-			*out_texture2d = new GalliumD3D11Surface(this, resource, *desc, dxgi_usage);
+		D3D11_TEXTURE2D_DESC cdesc = *desc;
+		cdesc.MipLevels = resource->last_level + 1;
+		if(cdesc.MipLevels == 1 && cdesc.ArraySize == 1)
+			*out_texture2d = new GalliumD3D11Surface(this, resource, cdesc, dxgi_usage);
 		else
-			*out_texture2d = new GalliumD3D11Texture2D(this, resource, *desc, dxgi_usage);
+			*out_texture2d = new GalliumD3D11Texture2D(this, resource, cdesc, dxgi_usage);
 		return S_OK;
 	}
 
@@ -793,7 +800,9 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
 		HRESULT hr = create_resource(PIPE_TEXTURE_3D, desc->Width, desc->Height, desc->Depth, desc->MipLevels, 1, desc->Format, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture3d ? &resource : 0);
 		if(hr != S_OK)
 			return hr;
-		*out_texture3d = new GalliumD3D11Texture3D(this, resource, *desc, dxgi_usage);
+		D3D11_TEXTURE3D_DESC cdesc = *desc;
+		cdesc.MipLevels = resource->last_level + 1;
+		*out_texture3d = new GalliumD3D11Texture3D(this, resource, cdesc, dxgi_usage);
 		return S_OK;
 	}
 




More information about the mesa-commit mailing list