3 using SiliconStudio.Core;
4 using SiliconStudio.Core.ReferenceCounting;
5 using SiliconStudio.Paradox.Games;
6 #if SILICONSTUDIO_PARADOX_GRAPHICS_API_DIRECT3D
30 using SharpDX.Direct3D;
31 using SharpDX.Direct3D11;
34 namespace SiliconStudio.
Paradox.Graphics
39 public partial class Texture2DBase
41 private SharpDX.DXGI.Surface dxgiSurface;
42 protected internal Texture2DDescription NativeDescription;
43 internal Texture2D TextureDepthStencilBuffer;
51 protected internal Texture2DBase(GraphicsDevice device, TextureDescription description2D, DataBox[] dataBoxes = null)
52 : base(device, CheckMipLevels(device, ref description2D),
ViewType.
Full, 0, 0)
54 NativeDescription = ConvertToNativeDescription(device, description2D);
56 NativeDeviceChild =
new SharpDX.Direct3D11.Texture2D(device.NativeDevice, NativeDescription, ConvertDataBoxes(dataBoxes));
57 NativeShaderResourceView = GetShaderResourceView(
ViewType, ArraySlice, MipLevel);
58 NativeUnorderedAccessView = GetUnorderedAccessView(ArraySlice, MipLevel);
61 if (TextureDepthStencilBuffer != null)
62 nativeShaderResourceView = TextureDepthStencilBuffer.nativeShaderResourceView;
70 protected internal Texture2DBase(GraphicsDevice device, Texture2DBase texture,
ViewType viewType,
int viewArraySlice,
int viewMipLevel,
PixelFormat viewFormat =
PixelFormat.None)
71 : base(device, texture, viewType, viewArraySlice, viewMipLevel, viewFormat)
74 _nativeDeviceChild = texture._nativeDeviceChild;
75 NativeResource = texture.NativeResource;
76 NativeDescription = texture.NativeDescription;
77 NativeShaderResourceView = GetShaderResourceView(viewType, viewArraySlice, viewMipLevel);
78 NativeUnorderedAccessView = GetUnorderedAccessView(viewArraySlice, viewMipLevel);
79 dxgiSurface = texture.dxgiSurface;
87 protected internal Texture2DBase(GraphicsDevice device, SharpDX.Direct3D11.Texture2D texture)
88 : base(device, ConvertFromNativeDescription(texture.Description),
ViewType.
Full, 0, 0)
91 NativeDescription = texture.Description;
92 NativeDeviceChild = texture;
93 NativeShaderResourceView = GetShaderResourceView(
ViewType, ArraySlice, MipLevel);
94 NativeUnorderedAccessView = GetUnorderedAccessView(ArraySlice, MipLevel);
99 if ((this.NativeDescription.BindFlags & BindFlags.ShaderResource) == 0)
104 GetViewSliceBounds(viewType, ref arrayOrDepthSlice, ref mipIndex, out arrayCount, out mipCount);
107 var srvDescription =
new ShaderResourceViewDescription() { Format = ComputeShaderResourceViewFormat()};
110 if (this.Description.ArraySize > 1)
113 if ((this.NativeDescription.OptionFlags & ResourceOptionFlags.TextureCube) != 0)
115 srvDescription.Dimension = ShaderResourceViewDimension.TextureCube;
116 srvDescription.TextureCube.MipLevels = mipCount;
117 srvDescription.TextureCube.MostDetailedMip = mipIndex;
122 srvDescription.Dimension = this.NativeDescription.SampleDescription.Count > 1 ? ShaderResourceViewDimension.Texture2DMultisampledArray : ShaderResourceViewDimension.Texture2DArray;
125 if (this.NativeDescription.SampleDescription.Count > 1)
127 srvDescription.Texture2DMSArray.ArraySize = arrayCount;
128 srvDescription.Texture2DMSArray.FirstArraySlice = arrayOrDepthSlice;
132 srvDescription.Texture2DArray.ArraySize = arrayCount;
133 srvDescription.Texture2DArray.FirstArraySlice = arrayOrDepthSlice;
134 srvDescription.Texture2DArray.MipLevels = mipCount;
135 srvDescription.Texture2DArray.MostDetailedMip = mipIndex;
141 srvDescription.Dimension = this.NativeDescription.SampleDescription.Count > 1 ? ShaderResourceViewDimension.Texture2DMultisampled : ShaderResourceViewDimension.Texture2D;
142 if (this.NativeDescription.SampleDescription.Count <= 1)
144 srvDescription.Texture2D.MipLevels = mipCount;
145 srvDescription.Texture2D.MostDetailedMip = mipIndex;
150 return new ShaderResourceView(this.GraphicsDevice.NativeDevice, NativeResource, srvDescription);
154 protected internal override void OnDestroyed()
161 protected internal override bool OnRecreate()
170 if (ParentTexture != null)
173 _nativeDeviceChild = ParentTexture._nativeDeviceChild;
174 NativeResource = ParentTexture.NativeResource;
175 NativeDescription = ((
Texture2D)ParentTexture).NativeDescription;
176 dxgiSurface = ((
Texture2D)ParentTexture).dxgiSurface;
185 && (NativeDescription.BindFlags & (BindFlags.RenderTarget | BindFlags.DepthStencil)) == 0)
188 NativeDeviceChild =
new SharpDX.Direct3D11.Texture2D(GraphicsDevice.NativeDevice, NativeDescription);
192 NativeShaderResourceView = GetShaderResourceView(
ViewType, ArraySlice, MipLevel);
193 NativeUnorderedAccessView = GetUnorderedAccessView(ArraySlice, MipLevel);
196 if (TextureDepthStencilBuffer != null)
197 nativeShaderResourceView = TextureDepthStencilBuffer.nativeShaderResourceView;
204 throw new NotImplementedException();
207 internal void Recreate(Texture2DDescription description)
209 NativeDescription = description;
210 NativeDeviceChild =
new SharpDX.Direct3D11.Texture2D(GraphicsDevice.NativeDevice, NativeDescription);
211 NativeShaderResourceView = GetShaderResourceView(
ViewType, ArraySlice, MipLevel);
212 NativeUnorderedAccessView = GetUnorderedAccessView(ArraySlice, MipLevel);
215 if (TextureDepthStencilBuffer != null)
216 nativeShaderResourceView = TextureDepthStencilBuffer.nativeShaderResourceView;
219 internal void Recreate(SharpDX.Direct3D11.Texture2D texture2D)
221 NativeDescription = texture2D.Description;
222 NativeDeviceChild = texture2D;
223 NativeShaderResourceView = GetShaderResourceView(
ViewType, ArraySlice, MipLevel);
224 NativeUnorderedAccessView = GetUnorderedAccessView(ArraySlice, MipLevel);
227 if (TextureDepthStencilBuffer != null)
228 nativeShaderResourceView = TextureDepthStencilBuffer.nativeShaderResourceView;
231 public override void Recreate(DataBox[] dataBoxes = null)
233 NativeDeviceChild =
new SharpDX.Direct3D11.Texture2D(GraphicsDevice.NativeDevice, NativeDescription, ConvertDataBoxes(dataBoxes));
234 NativeShaderResourceView = GetShaderResourceView(
ViewType, ArraySlice, MipLevel);
235 NativeUnorderedAccessView = GetUnorderedAccessView(ArraySlice, MipLevel);
238 if (TextureDepthStencilBuffer != null)
239 nativeShaderResourceView = TextureDepthStencilBuffer.nativeShaderResourceView;
242 private Format ComputeShaderResourceViewFormat()
244 var
format = NativeDescription.Format;
245 Format viewFormat =
format;
248 if ((Description.Flags &
TextureFlags.DepthStencil) != 0)
253 case SharpDX.DXGI.Format.R16_Typeless:
254 viewFormat = SharpDX.DXGI.Format.R16_Float;
256 case SharpDX.DXGI.Format.R32_Typeless:
257 viewFormat = SharpDX.DXGI.Format.R32_Float;
259 case SharpDX.DXGI.Format.R24G8_Typeless:
260 viewFormat = SharpDX.DXGI.Format.R24_UNorm_X8_Typeless;
262 case SharpDX.DXGI.Format.R32G8X24_Typeless:
263 viewFormat = SharpDX.DXGI.Format.R32_Float_X8X24_Typeless;
271 internal override UnorderedAccessView GetUnorderedAccessView(
int arrayOrDepthSlice,
int mipIndex)
273 if ((this.NativeDescription.BindFlags & BindFlags.UnorderedAccess) == 0)
278 GetViewSliceBounds(
ViewType.Single, ref arrayOrDepthSlice, ref mipIndex, out arrayCount, out mipCount);
280 var uavDescription =
new UnorderedAccessViewDescription()
282 Format = (Format)this.Description.Format,
283 Dimension =
this.Description.ArraySize > 1 ? UnorderedAccessViewDimension.Texture2DArray : UnorderedAccessViewDimension.Texture2D
286 if (this.Description.ArraySize > 1)
288 uavDescription.Texture2DArray.ArraySize = arrayCount;
289 uavDescription.Texture2DArray.FirstArraySlice = arrayOrDepthSlice;
290 uavDescription.Texture2DArray.MipSlice = mipIndex;
294 uavDescription.Texture2D.MipSlice = mipIndex;
297 return new UnorderedAccessView(GraphicsDevice.NativeDevice, NativeResource, uavDescription);
300 internal override RenderTargetView GetRenderTargetView(
ViewType viewType,
int arrayOrDepthSlice,
int mipIndex)
302 if ((this.NativeDescription.BindFlags & BindFlags.RenderTarget) == 0)
306 throw new NotSupportedException(
"ViewSlice.MipBand is not supported for render targets");
310 GetViewSliceBounds(viewType, ref arrayOrDepthSlice, ref mipIndex, out arrayCount, out mipCount);
313 var rtvDescription =
new RenderTargetViewDescription() { Format = this.NativeDescription.Format };
315 if (this.Description.ArraySize > 1)
317 rtvDescription.Dimension = this.NativeDescription.SampleDescription.Count > 1 ? RenderTargetViewDimension.Texture2DMultisampledArray : RenderTargetViewDimension.Texture2DArray;
318 if (this.NativeDescription.SampleDescription.Count > 1)
320 rtvDescription.Texture2DMSArray.ArraySize = arrayCount;
321 rtvDescription.Texture2DMSArray.FirstArraySlice = arrayOrDepthSlice;
325 rtvDescription.Texture2DArray.ArraySize = arrayCount;
326 rtvDescription.Texture2DArray.FirstArraySlice = arrayOrDepthSlice;
327 rtvDescription.Texture2DArray.MipSlice = mipIndex;
332 rtvDescription.Dimension = this.NativeDescription.SampleDescription.Count > 1 ? RenderTargetViewDimension.Texture2DMultisampled : RenderTargetViewDimension.Texture2D;
333 if (this.NativeDescription.SampleDescription.Count <= 1)
334 rtvDescription.Texture2D.MipSlice = mipIndex;
337 return new RenderTargetView(GraphicsDevice.NativeDevice, NativeResource, rtvDescription);
340 protected static TextureDescription ConvertFromNativeDescription(Texture2DDescription description)
342 var desc =
new TextureDescription()
344 Dimension = TextureDimension.Texture2D,
345 Width = description.Width,
346 Height = description.Height,
348 Level = (
MSAALevel)description.SampleDescription.Count,
350 MipLevels = description.MipLevels,
352 ArraySize = description.ArraySize,
356 if ((description.BindFlags & BindFlags.RenderTarget) !=0)
358 if ((description.BindFlags & BindFlags.UnorderedAccess) != 0)
360 if ((description.BindFlags & BindFlags.DepthStencil) != 0)
362 if ((description.BindFlags & BindFlags.ShaderResource) != 0)
368 protected static Texture2DDescription ConvertToNativeDescription(GraphicsDevice device, TextureDescription description)
370 var format = (Format) description.Format;
371 var
flags = description.Flags;
383 switch (description.Format)
385 case PixelFormat.D16_UNorm:
386 format = SharpDX.DXGI.Format.R16_Typeless;
388 case PixelFormat.D32_Float:
389 format = SharpDX.DXGI.Format.R32_Typeless;
391 case PixelFormat.D24_UNorm_S8_UInt:
392 format = SharpDX.DXGI.Format.R24G8_Typeless;
394 case PixelFormat.D32_Float_S8X24_UInt:
395 format = SharpDX.DXGI.Format.R32G8X24_Typeless;
398 throw new InvalidOperationException(
string.Format(
"Unsupported DepthFormat [{0}] for depth buffer", description.Format));
403 var desc =
new Texture2DDescription()
405 Width = description.Width,
406 Height = description.Height,
407 ArraySize = description.ArraySize,
409 SampleDescription =
new SampleDescription(1, 0),
410 BindFlags = GetBindFlagsFromTextureFlags(
flags),
412 MipLevels = description.MipLevels,
413 Usage = (ResourceUsage)description.Usage,
414 CpuAccessFlags = GetCpuAccessFlagsFromUsage(description.Usage),
415 OptionFlags = ResourceOptionFlags.None
419 desc.OptionFlags = ResourceOptionFlags.TextureCube;
424 #region Helper functions
432 private static TextureDescription CheckMipLevels(GraphicsDevice device, ref TextureDescription description)
434 if (device.Features.Profile <
GraphicsProfile.Level_10_0 && (description.Flags &
TextureFlags.DepthStencil) == 0 && description.Format.IsCompressed())
436 description.MipLevels = Math.Min(CalculateMipCount(description.Width, description.Height), description.MipLevels);
448 private static int CalculateMipCountFromSize(
int size,
int minimumSizeLastMip = 4)
452 throw new ArgumentOutOfRangeException(
"Value must be > 0",
"size");
455 if (minimumSizeLastMip <= 0)
457 throw new ArgumentOutOfRangeException(
"Value must be > 0",
"minimumSizeLastMip");
461 while ((size / 2) >= minimumSizeLastMip)
463 size = Math.Max(1, size / 2);
477 private static int CalculateMipCount(
int width,
int height,
int minimumSizeLastMip = 4)
479 return Math.Min(CalculateMipCountFromSize(width, minimumSizeLastMip), CalculateMipCountFromSize(height, minimumSizeLastMip));
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ DXGI_FORMAT _In_ DWORD flags
GraphicsResourceUsage
Identifies expected resource use during rendering. The usage directly reflects whether a resource is ...
MSAALevel
Multisample count level.
The clone mixin to clone the current mixins where the clone is emitted.
TextureDimension
Defines the dimension of a texture.
Flags
Enumeration of the new Assimp's flags.
ViewType
Defines how a view is selected from a resource.
Same as Deferred mode, except sprites are sorted by texture prior to drawing. This can improve perfor...
Gets a texture view for the whole texture for all mips/arrays dimensions.
GraphicsResourceLifetimeState
Describes the lifetime state of a graphics resource.
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
_In_ size_t _In_ size_t size
GraphicsProfile
Identifies the set of supported devices for the demo based on device capabilities.
PixelFormat
Defines various types of pixel formats.
The texture dimension is 2D.