4 using System.Collections.Generic;
5 using System.Runtime.InteropServices;
6 using SiliconStudio.Core.Diagnostics;
7 using SiliconStudio.TextureConverter.AtitcWrapper;
8 using SiliconStudio.TextureConverter.Requests;
11 namespace SiliconStudio.TextureConverter.TexLibraries
17 internal class AtitcTextureLibraryData : ITextureLibraryData
32 public CompressOptions Options;
39 internal class AtitcTexLibrary : ITexLibrary
41 private static Logger Log = GlobalLogger.GetLogger(
"AtitcTexLibrary");
46 public AtitcTexLibrary() {}
51 public void Dispose() {}
53 public void Dispose(TexImage image)
55 AtitcTextureLibraryData libraryData = (AtitcTextureLibraryData)image.LibraryData[
this];
56 if (libraryData.Data != IntPtr.Zero) Marshal.FreeHGlobal(libraryData.Data);
59 public bool SupportBGRAOrder()
64 public bool CanHandleRequest(TexImage image, IRequest request)
68 case RequestType.Compressing:
69 return SupportFormat(((CompressingRequest)request).Format) && SupportFormat(image.Format);
70 case RequestType.Decompressing:
71 return SupportFormat(image.Format);
78 public void StartLibrary(TexImage image)
80 AtitcTextureLibraryData libraryData =
new AtitcTextureLibraryData();
81 image.LibraryData[
this] = libraryData;
83 libraryData.Textures =
new Texture[image.SubImageArray.Length];
85 int bpp = (int)Tools.GetBPP(image.Format);
87 for (
int i = 0; i < image.SubImageArray.Length; ++i)
89 libraryData.Textures[i] =
new Texture(image.SubImageArray[i].Width, image.SubImageArray[i].Height, image.SubImageArray[i].RowPitch, RetrieveNativeFormat(image.Format), image.SubImageArray[i].DataSize, image.SubImageArray[i].Data);
92 libraryData.Data = IntPtr.Zero;
96 public void EndLibrary(TexImage image)
98 if (!image.LibraryData.ContainsKey(
this))
return;
99 AtitcTextureLibraryData libraryData = (AtitcTextureLibraryData)image.LibraryData[
this];
101 for (
int i = 0; i < libraryData.Textures.Length; ++i)
103 image.SubImageArray[i].Data = libraryData.Textures[i].pData;
104 image.SubImageArray[i].DataSize = libraryData.Textures[i].dwDataSize;
105 image.SubImageArray[i].Width = libraryData.Textures[i].dwWidth;
106 image.SubImageArray[i].Height = libraryData.Textures[i].dwHeight;
107 image.SubImageArray[i].RowPitch = libraryData.Textures[i].dwPitch;
108 image.SubImageArray[i].SlicePitch = libraryData.Textures[i].dwDataSize;
112 public void Execute(TexImage image, IRequest request)
114 AtitcTextureLibraryData libraryData = (AtitcTextureLibraryData) image.LibraryData[
this];
118 case RequestType.Compressing:
119 Compress(image, libraryData, (CompressingRequest)request);
121 case RequestType.Decompressing:
125 Log.Error(
"DxtTexLib (DirectXTex) can't handle this request: " + request.Type);
126 throw new TextureToolsException(
"DxtTexLib (DirectXTex) can't handle this request: " + request.Type);
137 private void Compress(TexImage image, AtitcTextureLibraryData libraryData, CompressingRequest request)
139 Log.Info(
"Converting/Compressing with " + request.Format +
" ...");
146 for (
int i = 0; i < libraryData.Textures.Length; ++i)
148 Tools.ComputePitch(request.Format, libraryData.Textures[i].dwWidth, libraryData.Textures[i].dwHeight, out pitch, out slice);
149 texOut[i] =
new Texture(libraryData.Textures[i].dwWidth, libraryData.Textures[i].dwHeight, pitch, RetrieveNativeFormat(request.Format), 0, IntPtr.Zero);
150 texOut[i].dwDataSize = Utilities.CalculateBufferSize(out texOut[i]);
151 totalSize += texOut[i].dwDataSize;
155 image.Data = Marshal.AllocHGlobal(totalSize);
157 libraryData.Options =
new CompressOptions(
false, 0, 0, 0,
false,
false, 0,
false, Speed.ATI_TC_Speed_Normal);
163 for (
int i = 0; i < libraryData.Textures.Length; ++i)
165 texOut[i].pData =
new IntPtr(image.Data.ToInt64() + offset);
166 offset += texOut[i].dwDataSize;
168 res = Utilities.ConvertTexture(out libraryData.Textures[i], out texOut[i], out libraryData.Options);
169 if (res != Result.ATI_TC_OK)
171 Log.Error(
"Compression failed: " + res);
172 throw new TextureToolsException(
"Compression failed: " + res);
175 libraryData.Textures[i] = texOut[i];
179 if (image.DisposingLibrary != null) image.DisposingLibrary.Dispose(image);
182 libraryData.Data = image.Data;
185 image.DataSize = totalSize;
186 image.RowPitch = libraryData.Textures[0].dwPitch;
187 image.Format = request.Format;
188 image.DisposingLibrary =
this;
198 private void Decompress(TexImage image, AtitcTextureLibraryData libraryData)
200 Log.Info(
"Decompressing texture ...");
204 int rowPitch, slicePitch;
207 for (
int i = 0; i < libraryData.Textures.Length; ++i)
209 Tools.ComputePitch(SiliconStudio.Paradox.Graphics.PixelFormat.R8G8B8A8_UNorm, libraryData.Textures[i].dwWidth, libraryData.Textures[i].dwHeight, out rowPitch, out slicePitch);
210 texOut[i] =
new Texture(libraryData.Textures[i].dwWidth, libraryData.Textures[i].dwHeight, libraryData.Textures[i].dwWidth * 4, Format.ATI_TC_FORMAT_ARGB_8888, 0, IntPtr.Zero);
211 texOut[i].dwDataSize = Utilities.CalculateBufferSize(out texOut[i]);
212 totalSize += texOut[i].dwDataSize;
216 image.Data = Marshal.AllocHGlobal(totalSize);
218 libraryData.Options =
new CompressOptions(
false, 0, 0, 0,
false,
false, 0,
false, Speed.ATI_TC_Speed_Normal);
224 for (
int i = 0; i < libraryData.Textures.Length; ++i)
226 texOut[i].pData =
new IntPtr(image.Data.ToInt64() + offset);
227 offset += texOut[i].dwDataSize;
229 res = Utilities.ConvertTexture(out libraryData.Textures[i], out texOut[i], out libraryData.Options);
230 if (res != Result.ATI_TC_OK)
232 Log.Error(
"Decompression failed: " + res);
233 throw new TextureToolsException(
"Decompression failed: " + res);
236 libraryData.Textures[i] = texOut[i];
240 if (image.DisposingLibrary != null) image.DisposingLibrary.Dispose(image);
243 libraryData.Data = image.Data;
244 image.DataSize = totalSize;
245 image.RowPitch = libraryData.Textures[0].dwPitch;
246 image.Format = SiliconStudio.Paradox.Graphics.PixelFormat.R8G8B8A8_UNorm;
247 image.DisposingLibrary =
this;
258 public bool SupportFormat(SiliconStudio.Paradox.Graphics.PixelFormat
format)
262 case SiliconStudio.Paradox.Graphics.PixelFormat.R8G8B8A8_UNorm:
263 case SiliconStudio.Paradox.Graphics.PixelFormat.B8G8R8A8_UNorm:
264 case SiliconStudio.Paradox.Graphics.PixelFormat.ATC_RGB:
265 case SiliconStudio.Paradox.Graphics.PixelFormat.ATC_RGBA_Explicit:
266 case SiliconStudio.Paradox.Graphics.PixelFormat.ATC_RGBA_Interpolated:
278 private Format RetrieveNativeFormat(SiliconStudio.Paradox.Graphics.PixelFormat
format)
282 case SiliconStudio.Paradox.Graphics.PixelFormat.R8G8B8A8_UNorm:
283 case SiliconStudio.Paradox.Graphics.PixelFormat.B8G8R8A8_UNorm:
284 return Format.ATI_TC_FORMAT_ARGB_8888;
285 case SiliconStudio.Paradox.Graphics.PixelFormat.ATC_RGB:
286 return Format.ATI_TC_FORMAT_ATC_RGB;
287 case SiliconStudio.Paradox.Graphics.PixelFormat.ATC_RGBA_Explicit:
288 return Format.ATI_TC_FORMAT_ATC_RGBA_Explicit;
289 case SiliconStudio.Paradox.Graphics.PixelFormat.ATC_RGBA_Interpolated:
290 return Format.ATI_TC_FORMAT_ATC_RGBA_Interpolated;
292 throw new TextureToolsException(
"UnHandled compression format by ATI texture.");
Base implementation for ILogger.
Same as Deferred mode, except sprites are sorted by texture prior to drawing. This can improve perfor...
HRESULT Decompress(_In_ const Image &cImage, _In_ DXGI_FORMAT format, _Out_ ScratchImage &image)
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
Output message to log right away.
HRESULT Compress(_In_ const Image &srcImage, _In_ DXGI_FORMAT format, _In_ DWORD compress, _In_ float alphaRef, _Out_ ScratchImage &cImage)