d3dx10: Introduce initial D3DX10CreateTextureFromMemory() implementation.
[wine.git] / dlls / d3dx10_43 / tests / d3dx10.c
blob251613d246f68e97e529ebc2bf7782a787611be4
1 /*
2 * Copyright 2016 Nikolay Sivov for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define COBJMACROS
20 #include "initguid.h"
21 #include "d3d10_1.h"
22 #include "d3dx10.h"
23 #include "wine/test.h"
25 /* 1x1 1bpp bmp image */
26 static const BYTE test_bmp_1bpp[] =
28 0x42, 0x4d, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x28, 0x00,
29 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
30 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x02, 0x00,
31 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xf1, 0xf2, 0xf3, 0x80, 0xf4, 0xf5, 0xf6, 0x81, 0x00, 0x00,
32 0x00, 0x00
34 static const BYTE test_bmp_1bpp_data[] =
36 0xf3, 0xf2, 0xf1, 0xff
39 /* 1x1 4bpp bmp image */
40 static const BYTE test_bmp_4bpp[] =
42 0x42, 0x4d, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x28, 0x00,
43 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,
44 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x02, 0x00,
45 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xf1, 0xf2, 0xf3, 0x80, 0xf4, 0xf5, 0xf6, 0x81, 0x00, 0x00,
46 0x00, 0x00
48 static const BYTE test_bmp_4bpp_data[] =
50 0xf3, 0xf2, 0xf1, 0xff
53 /* 1x1 8bpp bmp image */
54 static const BYTE test_bmp_8bpp[] =
56 0x42, 0x4d, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x28, 0x00,
57 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00,
58 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x02, 0x00,
59 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xf1, 0xf2, 0xf3, 0x80, 0xf4, 0xf5, 0xf6, 0x81, 0x00, 0x00,
60 0x00, 0x00
62 static const BYTE test_bmp_8bpp_data[] =
64 0xf3, 0xf2, 0xf1, 0xff
67 /* 1x1 16bpp bmp image */
68 static const BYTE test_bmp_16bpp[] =
70 0x42, 0x4d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
71 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00,
72 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00,
73 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x42, 0x00, 0x00, 0x00, 0x00
75 static const BYTE test_bmp_16bpp_data[] =
77 0x84, 0x84, 0x73, 0xff
80 /* 1x1 24bpp bmp image */
81 static const BYTE test_bmp_24bpp[] =
83 0x42, 0x4d, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
84 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
85 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x84, 0x84, 0x00, 0x00, 0x00
88 static const BYTE test_bmp_24bpp_data[] =
90 0x84, 0x84, 0x73, 0xff
93 /* 2x2 32bpp XRGB bmp image */
94 static const BYTE test_bmp_32bpp_xrgb[] =
96 0x42, 0x4d, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
97 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
98 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb0, 0xc0, 0x00, 0xa1, 0xb1, 0xc1, 0x00, 0xa2, 0xb2,
100 0xc2, 0x00, 0xa3, 0xb3, 0xc3, 0x00
102 static const BYTE test_bmp_32bpp_xrgb_data[] =
104 0xc2, 0xb2, 0xa2, 0xff, 0xc3, 0xb3, 0xa3, 0xff, 0xc0, 0xb0, 0xa0, 0xff, 0xc1, 0xb1, 0xa1, 0xff
108 /* 2x2 32bpp ARGB bmp image */
109 static const BYTE test_bmp_32bpp_argb[] =
111 0x42, 0x4d, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
112 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
113 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xb0, 0xc0, 0x00, 0xa1, 0xb1, 0xc1, 0x00, 0xa2, 0xb2,
115 0xc2, 0x00, 0xa3, 0xb3, 0xc3, 0x01
117 static const BYTE test_bmp_32bpp_argb_data[] =
119 0xc2, 0xb2, 0xa2, 0xff, 0xc3, 0xb3, 0xa3, 0xff, 0xc0, 0xb0, 0xa0, 0xff, 0xc1, 0xb1, 0xa1, 0xff
123 /* 1x1 8bpp gray png image */
124 static const BYTE test_png_8bpp_gray[] =
126 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
127 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x7e, 0x9b,
128 0x55, 0x00, 0x00, 0x00, 0x0a, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8, 0x0f, 0x00, 0x01,
129 0x01, 0x01, 0x00, 0x1b, 0xb6, 0xee, 0x56, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
130 0x42, 0x60, 0x82
132 static const BYTE test_png_8bpp_gray_data[] =
134 0xff, 0xff, 0xff, 0xff
137 /* 1x1 jpg image */
138 static const BYTE test_jpg[] =
140 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x01, 0x2c,
141 0x01, 0x2c, 0x00, 0x00, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05,
142 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0c, 0x08, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b,
143 0x0b, 0x09, 0x0c, 0x11, 0x0f, 0x12, 0x12, 0x11, 0x0f, 0x11, 0x11, 0x13, 0x16, 0x1c, 0x17, 0x13,
144 0x14, 0x1a, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1a, 0x1d, 0x1d, 0x1f, 0x1f, 0x1f, 0x13, 0x17,
145 0x22, 0x24, 0x22, 0x1e, 0x24, 0x1c, 0x1e, 0x1f, 0x1e, 0xff, 0xdb, 0x00, 0x43, 0x01, 0x05, 0x05,
146 0x05, 0x07, 0x06, 0x07, 0x0e, 0x08, 0x08, 0x0e, 0x1e, 0x14, 0x11, 0x14, 0x1e, 0x1e, 0x1e, 0x1e,
147 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
148 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e,
149 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xff, 0xc0,
150 0x00, 0x11, 0x08, 0x00, 0x01, 0x00, 0x01, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11,
151 0x01, 0xff, 0xc4, 0x00, 0x15, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xff, 0xc4, 0x00, 0x14, 0x10, 0x01, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc4,
154 0x00, 0x14, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x14, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01,
157 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xb2, 0xc0, 0x07, 0xff, 0xd9
159 static const BYTE test_jpg_data[] =
161 0xff, 0xff, 0xff, 0xff
164 /* 1x1 gif image */
165 static const BYTE test_gif[] =
167 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x01, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00, 0xff, 0xff, 0xff,
168 0xff, 0xff, 0xff, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44,
169 0x01, 0x00, 0x3b
171 static const BYTE test_gif_data[] =
173 0xff, 0xff, 0xff, 0xff
176 /* 1x1 tiff image */
177 static const BYTE test_tiff[] =
179 0x49, 0x49, 0x2a, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xfe, 0x00,
180 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00,
181 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
182 0x00, 0x00, 0x02, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x03, 0x01,
183 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x01, 0x00,
184 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0d, 0x01, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xd8, 0x00,
185 0x00, 0x00, 0x11, 0x01, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x12, 0x01,
186 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x01, 0x03, 0x00, 0x01, 0x00,
187 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x16, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00,
188 0x00, 0x00, 0x17, 0x01, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1a, 0x01,
189 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x1b, 0x01, 0x05, 0x00, 0x01, 0x00,
190 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
191 0x00, 0x00, 0x28, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
192 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x2f, 0x68, 0x6f, 0x6d, 0x65, 0x2f, 0x6d, 0x65,
193 0x68, 0x2f, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x74,
194 0x69, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48,
195 0x00, 0x00, 0x00, 0x01
197 static const BYTE test_tiff_data[] =
199 0x00, 0x00, 0x00, 0xff
202 /* 1x1 alpha dds image */
203 static const BYTE test_dds_alpha[] =
205 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
206 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
210 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0xff
215 static const BYTE test_dds_alpha_data[] =
217 0xff
220 /* 1x1 luminance dds image */
221 static const BYTE test_dds_luminance[] =
223 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
224 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x82
233 static const BYTE test_dds_luminance_data[] =
235 0x82, 0x82, 0x82, 0xff
238 /* 1x1 16bpp dds image */
239 static const BYTE test_dds_16bpp[] =
241 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
242 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
246 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00,
247 0xe0, 0x03, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x0e, 0x42
251 static const BYTE test_dds_16bpp_data[] =
253 0x84, 0x84, 0x73, 0xff
256 /* 1x1 24bpp dds image */
257 static const BYTE test_dds_24bpp[] =
259 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
260 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
261 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
264 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
265 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x70, 0x81, 0x83
269 static const BYTE test_dds_24bpp_data[] =
271 0x83, 0x81, 0x70, 0xff
274 /* 1x1 32bpp dds image */
275 static const BYTE test_dds_32bpp[] =
277 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
278 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
282 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
283 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x10, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x70, 0x81, 0x83, 0xff
287 static const BYTE test_dds_32bpp_data[] =
289 0x83, 0x81, 0x70, 0xff
292 /* 1x1 64bpp dds image */
293 static const BYTE test_dds_64bpp[] =
295 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
296 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
300 0x04, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x83, 0x83, 0x81, 0x81, 0x70, 0x70, 0xff, 0xff
305 static const BYTE test_dds_64bpp_data[] =
307 0x83, 0x83, 0x81, 0x81, 0x70, 0x70, 0xff, 0xff
310 /* 1x1 96bpp dds image */
311 static const BYTE test_dds_96bpp[] =
313 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
314 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
318 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0x00, 0x00, 0x84, 0x83, 0x03, 0x3f, 0x82, 0x81, 0x01, 0x3f, 0xe2, 0xe0, 0xe0, 0x3e
324 static const BYTE test_dds_96bpp_data[] =
326 0x84, 0x83, 0x03, 0x3f, 0x82, 0x81, 0x01, 0x3f, 0xe2, 0xe0, 0xe0, 0x3e
329 /* 1x1 128bpp dds image */
330 static const BYTE test_dds_128bpp[] =
332 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
333 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
337 0x04, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
340 0x84, 0x83, 0x03, 0x3f, 0x82, 0x81, 0x01, 0x3f, 0xe2, 0xe0, 0xe0, 0x3e, 0x00, 0x00, 0x80, 0x3f
342 static const BYTE test_dds_128bpp_data[] =
344 0x84, 0x83, 0x03, 0x3f, 0x82, 0x81, 0x01, 0x3f, 0xe2, 0xe0, 0xe0, 0x3e, 0x00, 0x00, 0x80, 0x3f
348 /* 4x4 DXT1 dds image */
349 static const BYTE test_dds_dxt1[] =
351 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00,
352 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
356 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x54, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x2a, 0x31, 0xf5, 0xbc, 0xe3, 0x6e, 0x2a, 0x3a
361 static const BYTE test_dds_dxt1_data[] =
363 0x2a, 0x31, 0xf5, 0xbc, 0xe3, 0x6e, 0x2a, 0x3a
366 /* 4x4 DXT2 dds image */
367 static const BYTE test_dds_dxt2[] =
369 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00,
370 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
374 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x54, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x40, 0x00,
376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
377 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xde, 0xc4, 0x10, 0x2f, 0xbf, 0xff, 0x7b,
378 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x53, 0x00, 0x00, 0x52, 0x52, 0x55, 0x55,
379 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x59, 0x00, 0x00, 0x54, 0x55, 0x55, 0x55
381 static const BYTE test_dds_dxt2_data[] =
383 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xde, 0xc4, 0x10, 0x2f, 0xbf, 0xff, 0x7b
387 /* 1x3 DXT3 dds image */
388 static const BYTE test_dds_dxt3[] =
390 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x00,
391 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
395 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x54, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x40, 0x00,
397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
398 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x92, 0x38, 0x84, 0x00, 0xff, 0x55, 0xff,
399 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x53, 0x8b, 0x53, 0x8b, 0x00, 0x00, 0x00, 0x00
401 static const BYTE test_dds_dxt3_data[] =
403 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4e, 0x92, 0xd6, 0x83, 0x00, 0xaa, 0x55, 0x55
407 /* 4x4 DXT4 dds image */
408 static const BYTE test_dds_dxt4[] =
410 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00,
411 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
415 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x54, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x40, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
418 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xde, 0xc4, 0x10, 0x2f, 0xbf, 0xff, 0x7b,
419 0xff, 0x00, 0x40, 0x02, 0x24, 0x49, 0x92, 0x24, 0x57, 0x53, 0x00, 0x00, 0x52, 0x52, 0x55, 0x55,
420 0xff, 0x00, 0x48, 0x92, 0x24, 0x49, 0x92, 0x24, 0xce, 0x59, 0x00, 0x00, 0x54, 0x55, 0x55, 0x55
422 static const BYTE test_dds_dxt4_data[] =
424 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xde, 0xc4, 0x10, 0x2f, 0xbf, 0xff, 0x7b
428 /* 4x2 DXT5 dds image */
429 static const BYTE test_dds_dxt5[] =
431 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,
432 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
434 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
436 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x54, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
437 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00,
438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
439 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x87, 0x0f, 0x78, 0x05, 0x05, 0x50, 0x50
441 static const BYTE test_dds_dxt5_data[] =
443 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x87, 0x0f, 0x78, 0x05, 0x05, 0x05, 0x05
447 /* 4x4 BC4 dds image */
448 static const BYTE test_dds_bc4[] =
450 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x00,
451 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
452 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
455 0x04, 0x00, 0x00, 0x00, 0x42, 0x43, 0x34, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x40, 0x00,
457 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
458 0xd9, 0x15, 0xbc, 0x41, 0x5b, 0xa3, 0x3d, 0x3a, 0x8f, 0x3d, 0x45, 0x81, 0x20, 0x45, 0x81, 0x20,
459 0x6f, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
461 static const BYTE test_dds_bc4_data[] =
463 0xd9, 0x15, 0xbc, 0x41, 0x5b, 0xa3, 0x3d, 0x3a
466 /* 6x3 BC5 dds image */
467 static const BYTE test_dds_bc5[] =
469 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x00,
470 0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
474 0x04, 0x00, 0x00, 0x00, 0x42, 0x43, 0x35, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x40, 0x00,
476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477 0x9f, 0x28, 0x73, 0xac, 0xd5, 0x80, 0xaa, 0xd5, 0x70, 0x2c, 0x4e, 0xd6, 0x76, 0x1d, 0xd6, 0x76,
478 0xd5, 0x0f, 0xc3, 0x50, 0x96, 0xcf, 0x53, 0x96, 0xdf, 0x16, 0xc3, 0x50, 0x96, 0xcf, 0x53, 0x96,
479 0x83, 0x55, 0x08, 0x83, 0x30, 0x08, 0x83, 0x30, 0x79, 0x46, 0x31, 0x1c, 0xc3, 0x31, 0x1c, 0xc3,
480 0x6d, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
482 static const BYTE test_dds_bc5_data[] =
484 0x95, 0x35, 0xe2, 0xa3, 0xf5, 0xd2, 0x28, 0x68, 0x65, 0x32, 0x7c, 0x4e, 0xdb, 0xe4, 0x56, 0x0a,
485 0xb9, 0x33, 0xaf, 0xf0, 0x52, 0xbe, 0xed, 0x27, 0xb4, 0x2e, 0xa6, 0x60, 0x4e, 0xb6, 0x5d, 0x3f
489 /* 4x4 DXT1 cube map */
490 static const BYTE test_dds_cube[] =
492 0x44, 0x44, 0x53, 0x20, 0x7c, 0x00, 0x00, 0x00, 0x07, 0x10, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x00,
493 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
497 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x54, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
498 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x40, 0x00,
499 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500 0xf5, 0xa7, 0x08, 0x69, 0x74, 0xc0, 0xbf, 0xd7, 0x32, 0x96, 0x0b, 0x7b, 0xcc, 0x55, 0xcc, 0x55,
501 0x0e, 0x84, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xa7, 0x08, 0x69, 0x74, 0xc0, 0xbf, 0xd7,
502 0x32, 0x96, 0x0b, 0x7b, 0xcc, 0x55, 0xcc, 0x55, 0x0e, 0x84, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00,
503 0xf5, 0xa7, 0x08, 0x69, 0x74, 0xc0, 0xbf, 0xd7, 0x32, 0x96, 0x0b, 0x7b, 0xcc, 0x55, 0xcc, 0x55,
504 0x0e, 0x84, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xa7, 0x08, 0x69, 0x74, 0xc0, 0xbf, 0xd7,
505 0x32, 0x96, 0x0b, 0x7b, 0xcc, 0x55, 0xcc, 0x55, 0x0e, 0x84, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00,
506 0xf5, 0xa7, 0x08, 0x69, 0x74, 0xc0, 0xbf, 0xd7, 0x32, 0x96, 0x0b, 0x7b, 0xcc, 0x55, 0xcc, 0x55,
507 0x0e, 0x84, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xa7, 0x08, 0x69, 0x74, 0xc0, 0xbf, 0xd7,
508 0x32, 0x96, 0x0b, 0x7b, 0xcc, 0x55, 0xcc, 0x55, 0x0e, 0x84, 0x0e, 0x84, 0x00, 0x00, 0x00, 0x00
510 static const BYTE test_dds_cube_data[] =
512 0xf5, 0xa7, 0x08, 0x69, 0x74, 0xc0, 0xbf, 0xd7
515 /* 1x1 wmp image */
516 static const BYTE test_wmp[] =
518 0x49, 0x49, 0xbc, 0x01, 0x20, 0x00, 0x00, 0x00, 0x24, 0xc3, 0xdd, 0x6f, 0x03, 0x4e, 0xfe, 0x4b,
519 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
520 0x08, 0x00, 0x01, 0xbc, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0xbc,
521 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xbc, 0x04, 0x00, 0x01, 0x00,
522 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x81, 0xbc, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
523 0x00, 0x00, 0x82, 0xbc, 0x0b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0x06, 0xc0, 0x42, 0x83, 0xbc,
524 0x0b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0x06, 0xc0, 0x42, 0xc0, 0xbc, 0x04, 0x00, 0x01, 0x00,
525 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0xc1, 0xbc, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x92, 0x00,
526 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x4d, 0x50, 0x48, 0x4f, 0x54, 0x4f, 0x00, 0x11, 0x45,
527 0xc0, 0x71, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xc0,
528 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x25, 0xff, 0xff, 0x00, 0x00, 0x01,
529 0x01, 0xc8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x10, 0x10, 0xa6, 0x18, 0x8c, 0x21,
530 0x00, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
531 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x4e, 0x0f, 0x3a, 0x4c, 0x94, 0x9d, 0xba, 0x79, 0xe7, 0x38,
532 0x4c, 0xcf, 0x14, 0xc3, 0x43, 0x91, 0x88, 0xfb, 0xdc, 0xe0, 0x7c, 0x34, 0x70, 0x9b, 0x28, 0xa9,
533 0x18, 0x74, 0x62, 0x87, 0x8e, 0xe4, 0x68, 0x5f, 0xb9, 0xcc, 0x0e, 0xe1, 0x8c, 0x76, 0x3a, 0x9b,
534 0x82, 0x76, 0x71, 0x13, 0xde, 0x50, 0xd4, 0x2d, 0xc2, 0xda, 0x1e, 0x3b, 0xa6, 0xa1, 0x62, 0x7b,
535 0xca, 0x1a, 0x85, 0x4b, 0x6e, 0x74, 0xec, 0x60
537 static const BYTE test_wmp_data[] =
539 0xff, 0xff, 0xff, 0xff
542 static const struct test_image
544 const BYTE *data;
545 unsigned int size;
546 const BYTE *expected_data;
547 D3DX10_IMAGE_INFO expected_info;
549 test_image[] =
552 test_bmp_1bpp, sizeof(test_bmp_1bpp), test_bmp_1bpp_data,
553 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_BMP}
556 test_bmp_4bpp, sizeof(test_bmp_4bpp), test_bmp_4bpp_data,
557 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_BMP}
560 test_bmp_8bpp, sizeof(test_bmp_8bpp), test_bmp_8bpp_data,
561 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_BMP}
564 test_bmp_16bpp, sizeof(test_bmp_16bpp), test_bmp_16bpp_data,
565 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_BMP}
568 test_bmp_24bpp, sizeof(test_bmp_24bpp), test_bmp_24bpp_data,
569 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_BMP}
572 test_bmp_32bpp_xrgb, sizeof(test_bmp_32bpp_xrgb), test_bmp_32bpp_xrgb_data,
573 {2, 2, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_BMP}
576 test_bmp_32bpp_argb, sizeof(test_bmp_32bpp_argb), test_bmp_32bpp_argb_data,
577 {2, 2, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_BMP}
580 test_png_8bpp_gray, sizeof(test_png_8bpp_gray), test_png_8bpp_gray_data,
581 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_PNG}
584 test_jpg, sizeof(test_jpg), test_jpg_data,
585 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_JPG}
588 test_gif, sizeof(test_gif), test_gif_data,
589 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_GIF}
592 test_tiff, sizeof(test_tiff), test_tiff_data,
593 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_TIFF}
596 test_dds_alpha, sizeof(test_dds_alpha), test_dds_alpha_data,
597 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
600 test_dds_luminance, sizeof(test_dds_luminance), test_dds_luminance_data,
601 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
604 test_dds_16bpp, sizeof(test_dds_16bpp), test_dds_16bpp_data,
605 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
608 test_dds_24bpp, sizeof(test_dds_24bpp), test_dds_24bpp_data,
609 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
612 test_dds_32bpp, sizeof(test_dds_32bpp), test_dds_32bpp_data,
613 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
616 test_dds_64bpp, sizeof(test_dds_64bpp), test_dds_64bpp_data,
617 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R16G16B16A16_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
620 test_dds_96bpp, sizeof(test_dds_96bpp), test_dds_96bpp_data,
621 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R32G32B32_FLOAT, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
624 test_dds_128bpp, sizeof(test_dds_128bpp), test_dds_128bpp_data,
625 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R32G32B32A32_FLOAT, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
628 test_dds_dxt1, sizeof(test_dds_dxt1), test_dds_dxt1_data,
629 {4, 4, 1, 1, 1, 0, DXGI_FORMAT_BC1_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
632 test_dds_dxt2, sizeof(test_dds_dxt2), test_dds_dxt2_data,
633 {4, 4, 1, 1, 3, 0, DXGI_FORMAT_BC2_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
636 test_dds_dxt3, sizeof(test_dds_dxt3), test_dds_dxt3_data,
637 {1, 3, 1, 1, 2, 0, DXGI_FORMAT_BC2_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
640 test_dds_dxt4, sizeof(test_dds_dxt4), test_dds_dxt4_data,
641 {4, 4, 1, 1, 3, 0, DXGI_FORMAT_BC3_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
644 test_dds_dxt5, sizeof(test_dds_dxt5), test_dds_dxt5_data,
645 {4, 2, 1, 1, 1, 0, DXGI_FORMAT_BC3_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
648 test_dds_bc4, sizeof(test_dds_bc4), test_dds_bc4_data,
649 {4, 4, 1, 1, 3, 0, DXGI_FORMAT_BC4_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
652 test_dds_bc5, sizeof(test_dds_bc5), test_dds_bc5_data,
653 {6, 3, 1, 1, 3, 0, DXGI_FORMAT_BC5_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
656 test_dds_cube, sizeof(test_dds_cube), test_dds_cube_data,
657 {4, 4, 1, 6, 3, 0x4, DXGI_FORMAT_BC1_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_DDS}
660 test_wmp, sizeof(test_wmp), test_wmp_data,
661 {1, 1, 1, 1, 1, 0, DXGI_FORMAT_R8G8B8A8_UNORM, D3D10_RESOURCE_DIMENSION_TEXTURE2D, D3DX10_IFF_WMP}
665 static WCHAR temp_dir[MAX_PATH];
667 static DXGI_FORMAT block_compressed_formats[] =
669 DXGI_FORMAT_BC1_TYPELESS, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM_SRGB,
670 DXGI_FORMAT_BC2_TYPELESS, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM_SRGB,
671 DXGI_FORMAT_BC3_TYPELESS, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM_SRGB,
672 DXGI_FORMAT_BC4_TYPELESS, DXGI_FORMAT_BC4_UNORM, DXGI_FORMAT_BC4_SNORM,
673 DXGI_FORMAT_BC5_TYPELESS, DXGI_FORMAT_BC5_UNORM, DXGI_FORMAT_BC5_SNORM,
674 DXGI_FORMAT_BC6H_TYPELESS, DXGI_FORMAT_BC6H_UF16, DXGI_FORMAT_BC6H_SF16,
675 DXGI_FORMAT_BC7_TYPELESS, DXGI_FORMAT_BC7_UNORM, DXGI_FORMAT_BC7_UNORM_SRGB
678 static BOOL is_block_compressed(DXGI_FORMAT format)
680 unsigned int i;
682 for (i = 0; i < ARRAY_SIZE(block_compressed_formats); ++i)
683 if (format == block_compressed_formats[i])
684 return TRUE;
686 return FALSE;
689 static unsigned int get_bpp_from_format(DXGI_FORMAT format)
691 switch (format)
693 case DXGI_FORMAT_R32G32B32A32_TYPELESS:
694 case DXGI_FORMAT_R32G32B32A32_FLOAT:
695 case DXGI_FORMAT_R32G32B32A32_UINT:
696 case DXGI_FORMAT_R32G32B32A32_SINT:
697 return 128;
698 case DXGI_FORMAT_R32G32B32_TYPELESS:
699 case DXGI_FORMAT_R32G32B32_FLOAT:
700 case DXGI_FORMAT_R32G32B32_UINT:
701 case DXGI_FORMAT_R32G32B32_SINT:
702 return 96;
703 case DXGI_FORMAT_R16G16B16A16_TYPELESS:
704 case DXGI_FORMAT_R16G16B16A16_FLOAT:
705 case DXGI_FORMAT_R16G16B16A16_UNORM:
706 case DXGI_FORMAT_R16G16B16A16_UINT:
707 case DXGI_FORMAT_R16G16B16A16_SNORM:
708 case DXGI_FORMAT_R16G16B16A16_SINT:
709 case DXGI_FORMAT_R32G32_TYPELESS:
710 case DXGI_FORMAT_R32G32_FLOAT:
711 case DXGI_FORMAT_R32G32_UINT:
712 case DXGI_FORMAT_R32G32_SINT:
713 case DXGI_FORMAT_R32G8X24_TYPELESS:
714 case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
715 case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
716 case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
717 case DXGI_FORMAT_Y416:
718 case DXGI_FORMAT_Y210:
719 case DXGI_FORMAT_Y216:
720 return 64;
721 case DXGI_FORMAT_R10G10B10A2_TYPELESS:
722 case DXGI_FORMAT_R10G10B10A2_UNORM:
723 case DXGI_FORMAT_R10G10B10A2_UINT:
724 case DXGI_FORMAT_R11G11B10_FLOAT:
725 case DXGI_FORMAT_R8G8B8A8_TYPELESS:
726 case DXGI_FORMAT_R8G8B8A8_UNORM:
727 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
728 case DXGI_FORMAT_R8G8B8A8_UINT:
729 case DXGI_FORMAT_R8G8B8A8_SNORM:
730 case DXGI_FORMAT_R8G8B8A8_SINT:
731 case DXGI_FORMAT_R16G16_TYPELESS:
732 case DXGI_FORMAT_R16G16_FLOAT:
733 case DXGI_FORMAT_R16G16_UNORM:
734 case DXGI_FORMAT_R16G16_UINT:
735 case DXGI_FORMAT_R16G16_SNORM:
736 case DXGI_FORMAT_R16G16_SINT:
737 case DXGI_FORMAT_R32_TYPELESS:
738 case DXGI_FORMAT_D32_FLOAT:
739 case DXGI_FORMAT_R32_FLOAT:
740 case DXGI_FORMAT_R32_UINT:
741 case DXGI_FORMAT_R32_SINT:
742 case DXGI_FORMAT_R24G8_TYPELESS:
743 case DXGI_FORMAT_D24_UNORM_S8_UINT:
744 case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
745 case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
746 case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
747 case DXGI_FORMAT_R8G8_B8G8_UNORM:
748 case DXGI_FORMAT_G8R8_G8B8_UNORM:
749 case DXGI_FORMAT_B8G8R8A8_UNORM:
750 case DXGI_FORMAT_B8G8R8X8_UNORM:
751 case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
752 case DXGI_FORMAT_B8G8R8A8_TYPELESS:
753 case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
754 case DXGI_FORMAT_B8G8R8X8_TYPELESS:
755 case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
756 case DXGI_FORMAT_AYUV:
757 case DXGI_FORMAT_Y410:
758 case DXGI_FORMAT_YUY2:
759 return 32;
760 case DXGI_FORMAT_P010:
761 case DXGI_FORMAT_P016:
762 return 24;
763 case DXGI_FORMAT_R8G8_TYPELESS:
764 case DXGI_FORMAT_R8G8_UNORM:
765 case DXGI_FORMAT_R8G8_UINT:
766 case DXGI_FORMAT_R8G8_SNORM:
767 case DXGI_FORMAT_R8G8_SINT:
768 case DXGI_FORMAT_R16_TYPELESS:
769 case DXGI_FORMAT_R16_FLOAT:
770 case DXGI_FORMAT_D16_UNORM:
771 case DXGI_FORMAT_R16_UNORM:
772 case DXGI_FORMAT_R16_UINT:
773 case DXGI_FORMAT_R16_SNORM:
774 case DXGI_FORMAT_R16_SINT:
775 case DXGI_FORMAT_B5G6R5_UNORM:
776 case DXGI_FORMAT_B5G5R5A1_UNORM:
777 case DXGI_FORMAT_A8P8:
778 case DXGI_FORMAT_B4G4R4A4_UNORM:
779 return 16;
780 case DXGI_FORMAT_NV12:
781 case DXGI_FORMAT_420_OPAQUE:
782 case DXGI_FORMAT_NV11:
783 return 12;
784 case DXGI_FORMAT_R8_TYPELESS:
785 case DXGI_FORMAT_R8_UNORM:
786 case DXGI_FORMAT_R8_UINT:
787 case DXGI_FORMAT_R8_SNORM:
788 case DXGI_FORMAT_R8_SINT:
789 case DXGI_FORMAT_A8_UNORM:
790 case DXGI_FORMAT_AI44:
791 case DXGI_FORMAT_IA44:
792 case DXGI_FORMAT_P8:
793 case DXGI_FORMAT_BC2_TYPELESS:
794 case DXGI_FORMAT_BC2_UNORM:
795 case DXGI_FORMAT_BC2_UNORM_SRGB:
796 case DXGI_FORMAT_BC3_TYPELESS:
797 case DXGI_FORMAT_BC3_UNORM:
798 case DXGI_FORMAT_BC3_UNORM_SRGB:
799 case DXGI_FORMAT_BC5_TYPELESS:
800 case DXGI_FORMAT_BC5_UNORM:
801 case DXGI_FORMAT_BC5_SNORM:
802 case DXGI_FORMAT_BC6H_TYPELESS:
803 case DXGI_FORMAT_BC6H_UF16:
804 case DXGI_FORMAT_BC6H_SF16:
805 case DXGI_FORMAT_BC7_TYPELESS:
806 case DXGI_FORMAT_BC7_UNORM:
807 case DXGI_FORMAT_BC7_UNORM_SRGB:
808 return 8;
809 case DXGI_FORMAT_BC1_TYPELESS:
810 case DXGI_FORMAT_BC1_UNORM:
811 case DXGI_FORMAT_BC1_UNORM_SRGB:
812 case DXGI_FORMAT_BC4_TYPELESS:
813 case DXGI_FORMAT_BC4_UNORM:
814 case DXGI_FORMAT_BC4_SNORM:
815 return 4;
816 case DXGI_FORMAT_R1_UNORM:
817 return 1;
818 default:
819 return 0;
823 static BOOL compare_float(float f, float g, unsigned int ulps)
825 int x = *(int *)&f;
826 int y = *(int *)&g;
828 if (x < 0)
829 x = INT_MIN - x;
830 if (y < 0)
831 y = INT_MIN - y;
833 if (abs(x - y) > ulps)
834 return FALSE;
836 return TRUE;
839 static char *get_str_a(const WCHAR *wstr)
841 static char buffer[MAX_PATH];
843 WideCharToMultiByte(CP_ACP, 0, wstr, -1, buffer, sizeof(buffer), NULL, NULL);
844 return buffer;
847 static BOOL create_file(const WCHAR *filename, const void *data, unsigned int size, WCHAR *out_path)
849 WCHAR path[MAX_PATH];
850 DWORD written;
851 HANDLE file;
853 if (!temp_dir[0])
854 GetTempPathW(ARRAY_SIZE(temp_dir), temp_dir);
855 lstrcpyW(path, temp_dir);
856 lstrcatW(path, filename);
858 file = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
859 if (file == INVALID_HANDLE_VALUE)
860 return FALSE;
862 if (WriteFile(file, data, size, &written, NULL))
864 CloseHandle(file);
866 if (out_path)
867 lstrcpyW(out_path, path);
868 return TRUE;
871 CloseHandle(file);
872 return FALSE;
875 static BOOL delete_file(const WCHAR *filename)
877 WCHAR path[MAX_PATH];
879 lstrcpyW(path, temp_dir);
880 lstrcatW(path, filename);
881 return DeleteFileW(path);
884 static ID3D10Device *create_device(void)
886 ID3D10Device *device;
887 HMODULE d3d10_mod = LoadLibraryA("d3d10.dll");
888 HRESULT (WINAPI *pD3D10CreateDevice)(IDXGIAdapter *, D3D10_DRIVER_TYPE, HMODULE, UINT, UINT, ID3D10Device **);
890 if (!d3d10_mod)
892 win_skip("d3d10.dll not present\n");
893 return NULL;
896 pD3D10CreateDevice = (void *)GetProcAddress(d3d10_mod, "D3D10CreateDevice");
897 if (SUCCEEDED(pD3D10CreateDevice(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, D3D10_SDK_VERSION, &device)))
898 return device;
899 if (SUCCEEDED(pD3D10CreateDevice(NULL, D3D10_DRIVER_TYPE_WARP, NULL, 0, D3D10_SDK_VERSION, &device)))
900 return device;
901 if (SUCCEEDED(pD3D10CreateDevice(NULL, D3D10_DRIVER_TYPE_REFERENCE, NULL, 0, D3D10_SDK_VERSION, &device)))
902 return device;
904 return NULL;
907 static HMODULE create_resource_module(const WCHAR *filename, const void *data, unsigned int size)
909 WCHAR resource_module_path[MAX_PATH], current_module_path[MAX_PATH];
910 HANDLE resource;
911 HMODULE module;
912 BOOL ret;
914 if (!temp_dir[0])
915 GetTempPathW(ARRAY_SIZE(temp_dir), temp_dir);
916 lstrcpyW(resource_module_path, temp_dir);
917 lstrcatW(resource_module_path, filename);
919 GetModuleFileNameW(NULL, current_module_path, ARRAY_SIZE(current_module_path));
920 ret = CopyFileW(current_module_path, resource_module_path, FALSE);
921 ok(ret, "CopyFileW failed, error %u.\n", GetLastError());
922 SetFileAttributesW(resource_module_path, FILE_ATTRIBUTE_NORMAL);
924 resource = BeginUpdateResourceW(resource_module_path, TRUE);
925 UpdateResourceW(resource, (LPCWSTR)RT_RCDATA, filename, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (void *)data, size);
926 EndUpdateResourceW(resource, FALSE);
928 module = LoadLibraryExW(resource_module_path, NULL, LOAD_LIBRARY_AS_DATAFILE);
930 return module;
933 static void delete_resource_module(const WCHAR *filename, HMODULE module)
935 WCHAR path[MAX_PATH];
937 FreeLibrary(module);
939 lstrcpyW(path, temp_dir);
940 lstrcatW(path, filename);
941 DeleteFileW(path);
944 static void check_image_info(D3DX10_IMAGE_INFO *image_info, const struct test_image *image, unsigned int line)
946 ok_(__FILE__, line)(image_info->Width == image->expected_info.Width,
947 "Got unexpected Width %u, expected %u.\n",
948 image_info->Width, image->expected_info.Width);
949 ok_(__FILE__, line)(image_info->Height == image->expected_info.Height,
950 "Got unexpected Height %u, expected %u.\n",
951 image_info->Height, image->expected_info.Height);
952 ok_(__FILE__, line)(image_info->Depth == image->expected_info.Depth,
953 "Got unexpected Depth %u, expected %u.\n",
954 image_info->Depth, image->expected_info.Depth);
955 ok_(__FILE__, line)(image_info->ArraySize == image->expected_info.ArraySize,
956 "Got unexpected ArraySize %u, expected %u.\n",
957 image_info->ArraySize, image->expected_info.ArraySize);
958 ok_(__FILE__, line)(image_info->MipLevels == image->expected_info.MipLevels,
959 "Got unexpected MipLevels %u, expected %u.\n",
960 image_info->MipLevels, image->expected_info.MipLevels);
961 ok_(__FILE__, line)(image_info->MiscFlags == image->expected_info.MiscFlags,
962 "Got unexpected MiscFlags %#x, expected %#x.\n",
963 image_info->MiscFlags, image->expected_info.MiscFlags);
964 ok_(__FILE__, line)(image_info->Format == image->expected_info.Format,
965 "Got unexpected Format %#x, expected %#x.\n",
966 image_info->Format, image->expected_info.Format);
967 ok_(__FILE__, line)(image_info->ResourceDimension == image->expected_info.ResourceDimension,
968 "Got unexpected ResourceDimension %u, expected %u.\n",
969 image_info->ResourceDimension, image->expected_info.ResourceDimension);
970 ok_(__FILE__, line)(image_info->ImageFileFormat == image->expected_info.ImageFileFormat,
971 "Got unexpected ImageFileFormat %u, expected %u.\n",
972 image_info->ImageFileFormat, image->expected_info.ImageFileFormat);
975 static ID3D10Texture2D *get_texture_readback(ID3D10Texture2D *texture)
977 D3D10_TEXTURE2D_DESC desc;
978 ID3D10Texture2D *readback;
979 ID3D10Device *device;
980 HRESULT hr;
982 ID3D10Texture2D_GetDevice(texture, &device);
984 ID3D10Texture2D_GetDesc(texture, &desc);
985 desc.Usage = D3D10_USAGE_STAGING;
986 desc.BindFlags = 0;
987 desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ;
989 hr = ID3D10Device_CreateTexture2D(device, &desc, NULL, &readback);
990 if (hr != S_OK)
992 ID3D10Device_Release(device);
993 return NULL;
995 ID3D10Device_CopyResource(device, (ID3D10Resource *)readback, (ID3D10Resource *)texture);
997 ID3D10Device_Release(device);
998 return readback;
1001 static void check_resource_info(ID3D10Resource *resource, const struct test_image *image, unsigned int line)
1003 unsigned int expected_mip_levels, expected_width, expected_height, max_dimension;
1004 D3D10_RESOURCE_DIMENSION resource_dimension;
1005 D3D10_TEXTURE2D_DESC desc_2d;
1006 D3D10_TEXTURE3D_DESC desc_3d;
1007 ID3D10Texture2D *texture_2d;
1008 ID3D10Texture3D *texture_3d;
1009 HRESULT hr;
1011 expected_width = image->expected_info.Width;
1012 expected_height = image->expected_info.Height;
1013 if (is_block_compressed(image->expected_info.Format))
1015 expected_width = (expected_width + 3) & ~3;
1016 expected_height = (expected_height + 3) & ~3;
1018 expected_mip_levels = 0;
1019 max_dimension = max(expected_width, expected_height);
1020 while (max_dimension)
1022 ++expected_mip_levels;
1023 max_dimension >>= 1;
1026 ID3D10Resource_GetType(resource, &resource_dimension);
1027 ok(resource_dimension == image->expected_info.ResourceDimension,
1028 "Got unexpected ResourceDimension %u, expected %u.\n",
1029 resource_dimension, image->expected_info.ResourceDimension);
1031 switch (resource_dimension)
1033 case D3D10_RESOURCE_DIMENSION_TEXTURE2D:
1034 hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture2D, (void **)&texture_2d);
1035 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1036 ID3D10Texture2D_GetDesc(texture_2d, &desc_2d);
1037 ok_(__FILE__, line)(desc_2d.Width == expected_width,
1038 "Got unexpected Width %u, expected %u.\n",
1039 desc_2d.Width, expected_width);
1040 ok_(__FILE__, line)(desc_2d.Height == expected_height,
1041 "Got unexpected Height %u, expected %u.\n",
1042 desc_2d.Height, expected_height);
1043 todo_wine_if(expected_mip_levels != 1)
1044 ok_(__FILE__, line)(desc_2d.MipLevels == expected_mip_levels,
1045 "Got unexpected MipLevels %u, expected %u.\n",
1046 desc_2d.MipLevels, expected_mip_levels);
1047 ok_(__FILE__, line)(desc_2d.ArraySize == image->expected_info.ArraySize,
1048 "Got unexpected ArraySize %u, expected %u.\n",
1049 desc_2d.ArraySize, image->expected_info.ArraySize);
1050 ok_(__FILE__, line)(desc_2d.Format == image->expected_info.Format,
1051 "Got unexpected Format %u, expected %u.\n",
1052 desc_2d.Format, image->expected_info.Format);
1053 ok_(__FILE__, line)(desc_2d.SampleDesc.Count == 1,
1054 "Got unexpected SampleDesc.Count %u, expected %u\n",
1055 desc_2d.SampleDesc.Count, 1);
1056 ok_(__FILE__, line)(desc_2d.SampleDesc.Quality == 0,
1057 "Got unexpected SampleDesc.Quality %u, expected %u\n",
1058 desc_2d.SampleDesc.Quality, 0);
1059 ok_(__FILE__, line)(desc_2d.Usage == D3D10_USAGE_DEFAULT,
1060 "Got unexpected Usage %u, expected %u\n",
1061 desc_2d.Usage, D3D10_USAGE_DEFAULT);
1062 ok_(__FILE__, line)(desc_2d.BindFlags == D3D10_BIND_SHADER_RESOURCE,
1063 "Got unexpected BindFlags %#x, expected %#x\n",
1064 desc_2d.BindFlags, D3D10_BIND_SHADER_RESOURCE);
1065 ok_(__FILE__, line)(desc_2d.CPUAccessFlags == 0,
1066 "Got unexpected CPUAccessFlags %#x, expected %#x\n",
1067 desc_2d.CPUAccessFlags, 0);
1068 ok_(__FILE__, line)(desc_2d.MiscFlags == image->expected_info.MiscFlags,
1069 "Got unexpected MiscFlags %#x, expected %#x.\n",
1070 desc_2d.MiscFlags, image->expected_info.MiscFlags);
1072 ID3D10Texture2D_Release(texture_2d);
1073 break;
1075 case D3D10_RESOURCE_DIMENSION_TEXTURE3D:
1076 hr = ID3D10Resource_QueryInterface(resource, &IID_ID3D10Texture3D, (void **)&texture_3d);
1077 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1078 ID3D10Texture3D_GetDesc(texture_3d, &desc_3d);
1079 ok_(__FILE__, line)(desc_3d.Width == expected_width,
1080 "Got unexpected Width %u, expected %u.\n",
1081 desc_3d.Width, expected_width);
1082 ok_(__FILE__, line)(desc_3d.Height == expected_height,
1083 "Got unexpected Height %u, expected %u.\n",
1084 desc_3d.Height, expected_height);
1085 ok_(__FILE__, line)(desc_3d.Depth == image->expected_info.Depth,
1086 "Got unexpected Depth %u, expected %u.\n",
1087 desc_3d.Depth, image->expected_info.Depth);
1088 ok_(__FILE__, line)(desc_3d.MipLevels == expected_mip_levels,
1089 "Got unexpected MipLevels %u, expected %u.\n",
1090 desc_3d.MipLevels, expected_mip_levels);
1091 ok_(__FILE__, line)(desc_3d.Format == image->expected_info.Format,
1092 "Got unexpected Format %u, expected %u.\n",
1093 desc_3d.Format, image->expected_info.Format);
1094 ok_(__FILE__, line)(desc_3d.Usage == D3D10_USAGE_DEFAULT,
1095 "Got unexpected Usage %u, expected %u\n",
1096 desc_3d.Usage, D3D10_USAGE_DEFAULT);
1097 ok_(__FILE__, line)(desc_3d.BindFlags == D3D10_BIND_SHADER_RESOURCE,
1098 "Got unexpected BindFlags %#x, expected %#x\n",
1099 desc_3d.BindFlags, D3D10_BIND_SHADER_RESOURCE);
1100 ok_(__FILE__, line)(desc_3d.CPUAccessFlags == 0,
1101 "Got unexpected CPUAccessFlags %#x, expected %#x\n",
1102 desc_3d.CPUAccessFlags, 0);
1103 ok_(__FILE__, line)(desc_3d.MiscFlags == image->expected_info.MiscFlags,
1104 "Got unexpected MiscFlags %#x, expected %#x.\n",
1105 desc_3d.MiscFlags, image->expected_info.MiscFlags);
1106 ID3D10Texture3D_Release(texture_3d);
1107 break;
1109 default:
1110 break;
1114 static void check_resource_data(ID3D10Resource *resource, const struct test_image *image, unsigned int line)
1116 unsigned int width, height, stride, i;
1117 D3D10_MAPPED_TEXTURE2D map;
1118 D3D10_TEXTURE2D_DESC desc;
1119 ID3D10Texture2D *readback;
1120 BOOL line_match;
1121 HRESULT hr;
1123 readback = get_texture_readback((ID3D10Texture2D *)resource);
1124 ok_(__FILE__, line)(readback != NULL, "Failed to get texture readback.\n");
1125 if (!readback)
1126 return;
1128 ID3D10Texture2D_GetDesc(readback, &desc);
1129 width = desc.Width;
1130 height = desc.Height;
1131 stride = (width * get_bpp_from_format(desc.Format) + 7) / 8;
1132 if (is_block_compressed(desc.Format))
1134 stride *= 4;
1135 height = (height + 3) / 4;
1138 hr = ID3D10Texture2D_Map(readback, 0, D3D10_MAP_READ, 0, &map);
1139 ok_(__FILE__, line)(hr == S_OK, "Map failed, hr %#x.\n", hr);
1140 if (hr != S_OK)
1142 ID3D10Texture2D_Unmap(readback, 0);
1143 return;
1146 for (i = 0; i < height; ++i)
1148 line_match = !memcmp(image->expected_data + stride * i,
1149 (BYTE *)map.pData + map.RowPitch * i, stride);
1150 todo_wine
1151 ok_(__FILE__, line)(line_match, "Data mismatch for line %u.\n", i);
1152 if (!line_match)
1153 break;
1156 ID3D10Texture2D_Unmap(readback, 0);
1159 static void test_D3DX10UnsetAllDeviceObjects(void)
1161 static const D3D10_INPUT_ELEMENT_DESC layout_desc[] =
1163 {"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0},
1165 #if 0
1166 float4 main(float4 pos : POSITION) : POSITION
1168 return pos;
1170 #endif
1171 static const DWORD simple_vs[] =
1173 0x43425844, 0x66689e7c, 0x643f0971, 0xb7f67ff4, 0xabc48688, 0x00000001, 0x000000d4, 0x00000003,
1174 0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
1175 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x49534f50, 0x4e4f4954, 0xababab00,
1176 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003,
1177 0x00000000, 0x0000000f, 0x49534f50, 0x4e4f4954, 0xababab00, 0x52444853, 0x00000038, 0x00010040,
1178 0x0000000e, 0x0300005f, 0x001010f2, 0x00000000, 0x03000065, 0x001020f2, 0x00000000, 0x05000036,
1179 0x001020f2, 0x00000000, 0x00101e46, 0x00000000, 0x0100003e,
1182 #if 0
1183 struct gs_out
1185 float4 pos : SV_POSITION;
1188 [maxvertexcount(4)]
1189 void main(point float4 vin[1] : POSITION, inout TriangleStream<gs_out> vout)
1191 float offset = 0.1 * vin[0].w;
1192 gs_out v;
1194 v.pos = float4(vin[0].x - offset, vin[0].y - offset, vin[0].z, vin[0].w);
1195 vout.Append(v);
1196 v.pos = float4(vin[0].x - offset, vin[0].y + offset, vin[0].z, vin[0].w);
1197 vout.Append(v);
1198 v.pos = float4(vin[0].x + offset, vin[0].y - offset, vin[0].z, vin[0].w);
1199 vout.Append(v);
1200 v.pos = float4(vin[0].x + offset, vin[0].y + offset, vin[0].z, vin[0].w);
1201 vout.Append(v);
1203 #endif
1204 static const DWORD simple_gs[] =
1206 0x43425844, 0x000ee786, 0xc624c269, 0x885a5cbe, 0x444b3b1f, 0x00000001, 0x0000023c, 0x00000003,
1207 0x0000002c, 0x00000060, 0x00000094, 0x4e475349, 0x0000002c, 0x00000001, 0x00000008, 0x00000020,
1208 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x49534f50, 0x4e4f4954, 0xababab00,
1209 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000001, 0x00000003,
1210 0x00000000, 0x0000000f, 0x505f5653, 0x5449534f, 0x004e4f49, 0x52444853, 0x000001a0, 0x00020040,
1211 0x00000068, 0x0400005f, 0x002010f2, 0x00000001, 0x00000000, 0x02000068, 0x00000001, 0x0100085d,
1212 0x0100285c, 0x04000067, 0x001020f2, 0x00000000, 0x00000001, 0x0200005e, 0x00000004, 0x0f000032,
1213 0x00100032, 0x00000000, 0x80201ff6, 0x00000041, 0x00000000, 0x00000000, 0x00004002, 0x3dcccccd,
1214 0x3dcccccd, 0x00000000, 0x00000000, 0x00201046, 0x00000000, 0x00000000, 0x05000036, 0x00102032,
1215 0x00000000, 0x00100046, 0x00000000, 0x06000036, 0x001020c2, 0x00000000, 0x00201ea6, 0x00000000,
1216 0x00000000, 0x01000013, 0x05000036, 0x00102012, 0x00000000, 0x0010000a, 0x00000000, 0x0e000032,
1217 0x00100052, 0x00000000, 0x00201ff6, 0x00000000, 0x00000000, 0x00004002, 0x3dcccccd, 0x00000000,
1218 0x3dcccccd, 0x00000000, 0x00201106, 0x00000000, 0x00000000, 0x05000036, 0x00102022, 0x00000000,
1219 0x0010002a, 0x00000000, 0x06000036, 0x001020c2, 0x00000000, 0x00201ea6, 0x00000000, 0x00000000,
1220 0x01000013, 0x05000036, 0x00102012, 0x00000000, 0x0010000a, 0x00000000, 0x05000036, 0x00102022,
1221 0x00000000, 0x0010001a, 0x00000000, 0x06000036, 0x001020c2, 0x00000000, 0x00201ea6, 0x00000000,
1222 0x00000000, 0x01000013, 0x05000036, 0x00102032, 0x00000000, 0x00100086, 0x00000000, 0x06000036,
1223 0x001020c2, 0x00000000, 0x00201ea6, 0x00000000, 0x00000000, 0x01000013, 0x0100003e,
1226 #if 0
1227 float4 main(float4 color : COLOR) : SV_TARGET
1229 return color;
1231 #endif
1232 static const DWORD simple_ps[] =
1234 0x43425844, 0x08c2b568, 0x17d33120, 0xb7d82948, 0x13a570fb, 0x00000001, 0x000000d0, 0x00000003,
1235 0x0000002c, 0x0000005c, 0x00000090, 0x4e475349, 0x00000028, 0x00000001, 0x00000008, 0x00000020,
1236 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000f0f, 0x4f4c4f43, 0xabab0052, 0x4e47534f,
1237 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000003, 0x00000000,
1238 0x0000000f, 0x545f5653, 0x45475241, 0xabab0054, 0x52444853, 0x00000038, 0x00000040, 0x0000000e,
1239 0x03001062, 0x001010f2, 0x00000000, 0x03000065, 0x001020f2, 0x00000000, 0x05000036, 0x001020f2,
1240 0x00000000, 0x00101e46, 0x00000000, 0x0100003e,
1243 D3D10_VIEWPORT tmp_viewport[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
1244 ID3D10ShaderResourceView *tmp_srv[D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT];
1245 ID3D10ShaderResourceView *srv[D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT];
1246 ID3D10RenderTargetView *tmp_rtv[D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT];
1247 RECT tmp_rect[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
1248 ID3D10SamplerState *tmp_sampler[D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT];
1249 ID3D10RenderTargetView *rtv[D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT];
1250 ID3D10Texture2D *rt_texture[D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT];
1251 ID3D10Buffer *cb[D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT];
1252 ID3D10Buffer *tmp_buffer[D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
1253 ID3D10SamplerState *sampler[D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT];
1254 ID3D10Buffer *buffer[D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
1255 unsigned int offset[D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
1256 unsigned int stride[D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
1257 ID3D10Buffer *so_buffer[D3D10_SO_BUFFER_SLOT_COUNT];
1258 ID3D10InputLayout *tmp_input_layout, *input_layout;
1259 ID3D10DepthStencilState *tmp_ds_state, *ds_state;
1260 ID3D10BlendState *tmp_blend_state, *blend_state;
1261 ID3D10RasterizerState *tmp_rs_state, *rs_state;
1262 ID3D10Predicate *tmp_predicate, *predicate;
1263 D3D10_SHADER_RESOURCE_VIEW_DESC srv_desc;
1264 ID3D10DepthStencilView *tmp_dsv, *dsv;
1265 D3D10_PRIMITIVE_TOPOLOGY topology;
1266 D3D10_TEXTURE2D_DESC texture_desc;
1267 ID3D10GeometryShader *tmp_gs, *gs;
1268 D3D10_DEPTH_STENCIL_DESC ds_desc;
1269 ID3D10VertexShader *tmp_vs, *vs;
1270 D3D10_SAMPLER_DESC sampler_desc;
1271 D3D10_QUERY_DESC predicate_desc;
1272 ID3D10PixelShader *tmp_ps, *ps;
1273 D3D10_RASTERIZER_DESC rs_desc;
1274 D3D10_BUFFER_DESC buffer_desc;
1275 D3D10_BLEND_DESC blend_desc;
1276 ID3D10Texture2D *ds_texture;
1277 unsigned int sample_mask;
1278 unsigned int stencil_ref;
1279 unsigned int count, i;
1280 float blend_factor[4];
1281 ID3D10Device *device;
1282 BOOL predicate_value;
1283 DXGI_FORMAT format;
1284 ULONG refcount;
1285 HRESULT hr;
1287 if (!(device = create_device()))
1289 skip("Failed to create device, skipping tests.\n");
1290 return;
1293 buffer_desc.ByteWidth = 1024;
1294 buffer_desc.Usage = D3D10_USAGE_DEFAULT;
1295 buffer_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
1296 buffer_desc.CPUAccessFlags = 0;
1297 buffer_desc.MiscFlags = 0;
1299 for (i = 0; i < D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; ++i)
1301 hr = ID3D10Device_CreateBuffer(device, &buffer_desc, NULL, &cb[i]);
1302 ok(SUCCEEDED(hr), "Failed to create buffer, hr %#x.\n", hr);
1305 buffer_desc.BindFlags = D3D10_BIND_VERTEX_BUFFER | D3D10_BIND_INDEX_BUFFER | D3D10_BIND_SHADER_RESOURCE;
1307 for (i = 0; i < D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; ++i)
1309 hr = ID3D10Device_CreateBuffer(device, &buffer_desc, NULL, &buffer[i]);
1310 ok(SUCCEEDED(hr), "Failed to create buffer, hr %#x.\n", hr);
1312 stride[i] = (i + 1) * 4;
1313 offset[i] = (i + 1) * 16;
1316 buffer_desc.BindFlags = D3D10_BIND_STREAM_OUTPUT;
1318 for (i = 0; i < D3D10_SO_BUFFER_SLOT_COUNT; ++i)
1320 hr = ID3D10Device_CreateBuffer(device, &buffer_desc, NULL, &so_buffer[i]);
1321 ok(SUCCEEDED(hr), "Failed to create buffer, hr %#x.\n", hr);
1324 srv_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
1325 srv_desc.ViewDimension = D3D10_SRV_DIMENSION_BUFFER;
1326 U(srv_desc).Buffer.ElementOffset = 0;
1327 U(srv_desc).Buffer.ElementWidth = 64;
1329 for (i = 0; i < D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT; ++i)
1331 hr = ID3D10Device_CreateShaderResourceView(device,
1332 (ID3D10Resource *)buffer[i % D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT], &srv_desc, &srv[i]);
1333 ok(SUCCEEDED(hr), "Failed to create shader resource view, hr %#x.\n", hr);
1336 sampler_desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR;
1337 sampler_desc.AddressU = D3D10_TEXTURE_ADDRESS_CLAMP;
1338 sampler_desc.AddressV = D3D10_TEXTURE_ADDRESS_CLAMP;
1339 sampler_desc.AddressW = D3D10_TEXTURE_ADDRESS_CLAMP;
1340 sampler_desc.MipLODBias = 0.0f;
1341 sampler_desc.MaxAnisotropy = 16;
1342 sampler_desc.ComparisonFunc = D3D10_COMPARISON_NEVER;
1343 sampler_desc.BorderColor[0] = 0.0f;
1344 sampler_desc.BorderColor[1] = 0.0f;
1345 sampler_desc.BorderColor[2] = 0.0f;
1346 sampler_desc.BorderColor[3] = 0.0f;
1347 sampler_desc.MinLOD = 0.0f;
1348 sampler_desc.MaxLOD = 16.0f;
1350 for (i = 0; i < D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)
1352 sampler_desc.MinLOD = (float)i;
1354 hr = ID3D10Device_CreateSamplerState(device, &sampler_desc, &sampler[i]);
1355 ok(SUCCEEDED(hr), "Failed to create sampler state, hr %#x.\n", hr);
1358 hr = ID3D10Device_CreateVertexShader(device, simple_vs, sizeof(simple_vs), &vs);
1359 ok(SUCCEEDED(hr), "Failed to create vertex shader, hr %#x.\n", hr);
1361 hr = ID3D10Device_CreateGeometryShader(device, simple_gs, sizeof(simple_gs), &gs);
1362 ok(SUCCEEDED(hr), "Failed to create geometry shader, hr %#x.\n", hr);
1364 hr = ID3D10Device_CreatePixelShader(device, simple_ps, sizeof(simple_ps), &ps);
1365 ok(SUCCEEDED(hr), "Failed to create pixel shader, hr %#x.\n", hr);
1367 hr = ID3D10Device_CreateInputLayout(device, layout_desc, ARRAY_SIZE(layout_desc), simple_vs,
1368 sizeof(simple_vs), &input_layout);
1369 ok(SUCCEEDED(hr), "Failed to create input layout, hr %#x.\n", hr);
1371 blend_desc.AlphaToCoverageEnable = FALSE;
1372 blend_desc.BlendEnable[0] = FALSE;
1373 blend_desc.BlendEnable[1] = FALSE;
1374 blend_desc.BlendEnable[2] = FALSE;
1375 blend_desc.BlendEnable[3] = FALSE;
1376 blend_desc.BlendEnable[4] = FALSE;
1377 blend_desc.BlendEnable[5] = FALSE;
1378 blend_desc.BlendEnable[6] = FALSE;
1379 blend_desc.BlendEnable[7] = FALSE;
1380 blend_desc.SrcBlend = D3D10_BLEND_ONE;
1381 blend_desc.DestBlend = D3D10_BLEND_ZERO;
1382 blend_desc.BlendOp = D3D10_BLEND_OP_ADD;
1383 blend_desc.SrcBlendAlpha = D3D10_BLEND_ONE;
1384 blend_desc.DestBlendAlpha = D3D10_BLEND_ZERO;
1385 blend_desc.BlendOpAlpha = D3D10_BLEND_OP_ADD;
1386 blend_desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
1387 blend_desc.RenderTargetWriteMask[1] = D3D10_COLOR_WRITE_ENABLE_ALL;
1388 blend_desc.RenderTargetWriteMask[2] = D3D10_COLOR_WRITE_ENABLE_ALL;
1389 blend_desc.RenderTargetWriteMask[3] = D3D10_COLOR_WRITE_ENABLE_ALL;
1390 blend_desc.RenderTargetWriteMask[4] = D3D10_COLOR_WRITE_ENABLE_ALL;
1391 blend_desc.RenderTargetWriteMask[5] = D3D10_COLOR_WRITE_ENABLE_ALL;
1392 blend_desc.RenderTargetWriteMask[6] = D3D10_COLOR_WRITE_ENABLE_ALL;
1393 blend_desc.RenderTargetWriteMask[7] = D3D10_COLOR_WRITE_ENABLE_ALL;
1395 hr = ID3D10Device_CreateBlendState(device, &blend_desc, &blend_state);
1396 ok(SUCCEEDED(hr), "Failed to create blend state, hr %#x.\n", hr);
1398 ds_desc.DepthEnable = TRUE;
1399 ds_desc.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ALL;
1400 ds_desc.DepthFunc = D3D10_COMPARISON_LESS;
1401 ds_desc.StencilEnable = FALSE;
1402 ds_desc.StencilReadMask = D3D10_DEFAULT_STENCIL_READ_MASK;
1403 ds_desc.StencilWriteMask = D3D10_DEFAULT_STENCIL_WRITE_MASK;
1404 ds_desc.FrontFace.StencilFailOp = D3D10_STENCIL_OP_KEEP;
1405 ds_desc.FrontFace.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP;
1406 ds_desc.FrontFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;
1407 ds_desc.FrontFace.StencilFunc = D3D10_COMPARISON_ALWAYS;
1408 ds_desc.BackFace.StencilFailOp = D3D10_STENCIL_OP_KEEP;
1409 ds_desc.BackFace.StencilDepthFailOp = D3D10_STENCIL_OP_KEEP;
1410 ds_desc.BackFace.StencilPassOp = D3D10_STENCIL_OP_KEEP;
1411 ds_desc.BackFace.StencilFunc = D3D10_COMPARISON_ALWAYS;
1413 hr = ID3D10Device_CreateDepthStencilState(device, &ds_desc, &ds_state);
1414 ok(SUCCEEDED(hr), "Failed to create depthstencil state, hr %#x.\n", hr);
1416 texture_desc.Width = 512;
1417 texture_desc.Height = 512;
1418 texture_desc.MipLevels = 1;
1419 texture_desc.ArraySize = 1;
1420 texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
1421 texture_desc.SampleDesc.Count = 1;
1422 texture_desc.SampleDesc.Quality = 0;
1423 texture_desc.Usage = D3D10_USAGE_DEFAULT;
1424 texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET;
1425 texture_desc.CPUAccessFlags = 0;
1426 texture_desc.MiscFlags = 0;
1428 for (i = 0; i < D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
1430 hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &rt_texture[i]);
1431 ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
1434 texture_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
1435 texture_desc.BindFlags = D3D10_BIND_DEPTH_STENCIL;
1437 hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &ds_texture);
1438 ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
1440 for (i = 0; i < D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
1442 hr = ID3D10Device_CreateRenderTargetView(device, (ID3D10Resource *)rt_texture[i], NULL, &rtv[i]);
1443 ok(SUCCEEDED(hr), "Failed to create rendertarget view, hr %#x.\n", hr);
1446 hr = ID3D10Device_CreateDepthStencilView(device, (ID3D10Resource *)ds_texture, NULL, &dsv);
1447 ok(SUCCEEDED(hr), "Failed to create depthstencil view, hr %#x.\n", hr);
1449 for (i = 0; i < D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ++i)
1451 SetRect(&tmp_rect[i], i, i * 2, i + 1, (i + 1) * 2);
1453 tmp_viewport[i].TopLeftX = i * 3;
1454 tmp_viewport[i].TopLeftY = i * 4;
1455 tmp_viewport[i].Width = 3;
1456 tmp_viewport[i].Height = 4;
1457 tmp_viewport[i].MinDepth = i * 0.01f;
1458 tmp_viewport[i].MaxDepth = (i + 1) * 0.01f;
1461 rs_desc.FillMode = D3D10_FILL_SOLID;
1462 rs_desc.CullMode = D3D10_CULL_BACK;
1463 rs_desc.FrontCounterClockwise = FALSE;
1464 rs_desc.DepthBias = 0;
1465 rs_desc.DepthBiasClamp = 0.0f;
1466 rs_desc.SlopeScaledDepthBias = 0.0f;
1467 rs_desc.DepthClipEnable = TRUE;
1468 rs_desc.ScissorEnable = FALSE;
1469 rs_desc.MultisampleEnable = FALSE;
1470 rs_desc.AntialiasedLineEnable = FALSE;
1472 hr = ID3D10Device_CreateRasterizerState(device, &rs_desc, &rs_state);
1473 ok(SUCCEEDED(hr), "Failed to create rasterizer state, hr %#x.\n", hr);
1475 predicate_desc.Query = D3D10_QUERY_OCCLUSION_PREDICATE;
1476 predicate_desc.MiscFlags = 0;
1478 hr = ID3D10Device_CreatePredicate(device, &predicate_desc, &predicate);
1479 ok(SUCCEEDED(hr), "Failed to create predicate, hr %#x.\n", hr);
1481 ID3D10Device_VSSetConstantBuffers(device, 0, D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, cb);
1482 ID3D10Device_VSSetShaderResources(device, 0, D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, srv);
1483 ID3D10Device_VSSetSamplers(device, 0, D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT, sampler);
1484 ID3D10Device_VSSetShader(device, vs);
1486 ID3D10Device_GSSetConstantBuffers(device, 0, D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, cb);
1487 ID3D10Device_GSSetShaderResources(device, 0, D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, srv);
1488 ID3D10Device_GSSetSamplers(device, 0, D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT, sampler);
1489 ID3D10Device_GSSetShader(device, gs);
1491 ID3D10Device_PSSetConstantBuffers(device, 0, D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, cb);
1492 ID3D10Device_PSSetShaderResources(device, 0, D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, srv);
1493 ID3D10Device_PSSetSamplers(device, 0, D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT, sampler);
1494 ID3D10Device_PSSetShader(device, ps);
1496 ID3D10Device_IASetVertexBuffers(device, 0, D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, buffer, stride, offset);
1497 ID3D10Device_IASetIndexBuffer(device, buffer[0], DXGI_FORMAT_R32_UINT, offset[0]);
1498 ID3D10Device_IASetInputLayout(device, input_layout);
1499 ID3D10Device_IASetPrimitiveTopology(device, D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
1501 blend_factor[0] = 0.1f;
1502 blend_factor[1] = 0.2f;
1503 blend_factor[2] = 0.3f;
1504 blend_factor[3] = 0.4f;
1505 ID3D10Device_OMSetBlendState(device, blend_state, blend_factor, 0xff00ff00);
1506 ID3D10Device_OMSetDepthStencilState(device, ds_state, 3);
1507 ID3D10Device_OMSetRenderTargets(device, D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT, rtv, dsv);
1509 ID3D10Device_RSSetScissorRects(device, D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, tmp_rect);
1510 ID3D10Device_RSSetViewports(device, D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE, tmp_viewport);
1511 ID3D10Device_RSSetState(device, rs_state);
1513 ID3D10Device_SOSetTargets(device, D3D10_SO_BUFFER_SLOT_COUNT, so_buffer, offset);
1515 ID3D10Device_SetPredication(device, predicate, TRUE);
1517 hr = D3DX10UnsetAllDeviceObjects(device);
1518 ok(SUCCEEDED(hr), "D3DX10UnsetAllDeviceObjects() failed, %#x.\n", hr);
1520 ID3D10Device_VSGetConstantBuffers(device, 0, D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, tmp_buffer);
1521 for (i = 0; i < D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; ++i)
1523 ok(!tmp_buffer[i], "Got unexpected constant buffer %p in slot %u.\n", tmp_buffer[i], i);
1525 ID3D10Device_VSGetShaderResources(device, 0, D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, tmp_srv);
1526 for (i = 0; i < D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT; ++i)
1528 ok(!tmp_srv[i], "Got unexpected shader resource view %p in slot %u.\n", tmp_srv[i], i);
1530 ID3D10Device_VSGetSamplers(device, 0, D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT, tmp_sampler);
1531 for (i = 0; i < D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)
1533 ok(!tmp_sampler[i], "Got unexpected sampler %p in slot %u.\n", tmp_sampler[i], i);
1535 ID3D10Device_VSGetShader(device, &tmp_vs);
1536 ok(!tmp_vs, "Got unexpected vertex shader %p.\n", tmp_vs);
1538 ID3D10Device_GSGetConstantBuffers(device, 0, D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, tmp_buffer);
1539 for (i = 0; i < D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; ++i)
1541 ok(!tmp_buffer[i], "Got unexpected constant buffer %p in slot %u.\n", tmp_buffer[i], i);
1543 ID3D10Device_GSGetShaderResources(device, 0, D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, tmp_srv);
1544 for (i = 0; i < D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT; ++i)
1546 ok(!tmp_srv[i], "Got unexpected shader resource view %p in slot %u.\n", tmp_srv[i], i);
1548 ID3D10Device_GSGetSamplers(device, 0, D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT, tmp_sampler);
1549 for (i = 0; i < D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)
1551 ok(!tmp_sampler[i], "Got unexpected sampler %p in slot %u.\n", tmp_sampler[i], i);
1553 ID3D10Device_GSGetShader(device, &tmp_gs);
1554 ok(!tmp_gs, "Got unexpected geometry shader %p.\n", tmp_gs);
1556 ID3D10Device_PSGetConstantBuffers(device, 0, D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, tmp_buffer);
1557 for (i = 0; i < D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; ++i)
1559 ok(!tmp_buffer[i], "Got unexpected constant buffer %p in slot %u.\n", tmp_buffer[i], i);
1561 ID3D10Device_PSGetShaderResources(device, 0, D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT, tmp_srv);
1562 for (i = 0; i < D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT; ++i)
1564 ok(!tmp_srv[i], "Got unexpected shader resource view %p in slot %u.\n", tmp_srv[i], i);
1566 ID3D10Device_PSGetSamplers(device, 0, D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT, tmp_sampler);
1567 for (i = 0; i < D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)
1569 ok(!tmp_sampler[i], "Got unexpected sampler %p in slot %u.\n", tmp_sampler[i], i);
1571 ID3D10Device_PSGetShader(device, &tmp_ps);
1572 ok(!tmp_ps, "Got unexpected pixel shader %p.\n", tmp_ps);
1574 ID3D10Device_IAGetVertexBuffers(device, 0, D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, tmp_buffer, stride, offset);
1575 for (i = 0; i < D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; ++i)
1577 ok(!tmp_buffer[i], "Got unexpected vertex buffer %p in slot %u.\n", tmp_buffer[i], i);
1578 ok(!stride[i], "Got unexpected stride %u in slot %u.\n", stride[i], i);
1579 ok(!offset[i], "Got unexpected offset %u in slot %u.\n", offset[i], i);
1581 ID3D10Device_IAGetIndexBuffer(device, tmp_buffer, &format, offset);
1582 ok(!tmp_buffer[0], "Got unexpected index buffer %p.\n", tmp_buffer[0]);
1583 ok(format == DXGI_FORMAT_R32_UINT, "Got unexpected index buffer format %#x.\n", format);
1584 ok(!offset[0], "Got unexpected index buffer offset %u.\n", offset[0]);
1585 ID3D10Device_IAGetInputLayout(device, &tmp_input_layout);
1586 ok(!tmp_input_layout, "Got unexpected input layout %p.\n", tmp_input_layout);
1587 ID3D10Device_IAGetPrimitiveTopology(device, &topology);
1588 ok(topology == D3D10_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP, "Got unexpected primitive topology %#x.\n", topology);
1590 ID3D10Device_OMGetBlendState(device, &tmp_blend_state, blend_factor, &sample_mask);
1591 ok(!tmp_blend_state, "Got unexpected blend state %p.\n", tmp_blend_state);
1592 ok(blend_factor[0] == 0.0f && blend_factor[1] == 0.0f
1593 && blend_factor[2] == 0.0f && blend_factor[3] == 0.0f,
1594 "Got unexpected blend factor {%.8e, %.8e, %.8e, %.8e}.\n",
1595 blend_factor[0], blend_factor[1], blend_factor[2], blend_factor[3]);
1596 ok(sample_mask == 0, "Got unexpected sample mask %#x.\n", sample_mask);
1597 ID3D10Device_OMGetDepthStencilState(device, &tmp_ds_state, &stencil_ref);
1598 ok(!tmp_ds_state, "Got unexpected depth stencil state %p.\n", tmp_ds_state);
1599 ok(!stencil_ref, "Got unexpected stencil ref %u.\n", stencil_ref);
1600 ID3D10Device_OMGetRenderTargets(device, D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT, tmp_rtv, &tmp_dsv);
1601 for (i = 0; i < D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
1603 ok(!tmp_rtv[i], "Got unexpected render target view %p in slot %u.\n", tmp_rtv[i], i);
1605 ok(!tmp_dsv, "Got unexpected depth stencil view %p.\n", tmp_dsv);
1607 ID3D10Device_RSGetScissorRects(device, &count, NULL);
1608 ok(count == D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE,
1609 "Got unexpected scissor rect count %u.\n", count);
1610 memset(tmp_rect, 0x55, sizeof(tmp_rect));
1611 count = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
1612 ID3D10Device_RSGetScissorRects(device, &count, tmp_rect);
1613 for (i = 0; i < D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ++i)
1615 ok(tmp_rect[i].left == i
1616 && tmp_rect[i].top == i * 2
1617 && tmp_rect[i].right == i + 1
1618 && tmp_rect[i].bottom == (i + 1) * 2,
1619 "Got unexpected scissor rect %s in slot %u.\n",
1620 wine_dbgstr_rect(&tmp_rect[i]), i);
1622 ID3D10Device_RSGetViewports(device, &count, NULL);
1623 ok(count == D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE,
1624 "Got unexpected viewport count %u.\n", count);
1625 memset(tmp_viewport, 0x55, sizeof(tmp_viewport));
1626 count = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE;
1627 ID3D10Device_RSGetViewports(device, &count, tmp_viewport);
1628 for (i = 0; i < D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; ++i)
1630 ok(tmp_viewport[i].TopLeftX == i * 3
1631 && tmp_viewport[i].TopLeftY == i * 4
1632 && tmp_viewport[i].Width == 3
1633 && tmp_viewport[i].Height == 4
1634 && compare_float(tmp_viewport[i].MinDepth, i * 0.01f, 16)
1635 && compare_float(tmp_viewport[i].MaxDepth, (i + 1) * 0.01f, 16),
1636 "Got unexpected viewport {%d, %d, %u, %u, %.8e, %.8e} in slot %u.\n",
1637 tmp_viewport[i].TopLeftX, tmp_viewport[i].TopLeftY, tmp_viewport[i].Width,
1638 tmp_viewport[i].Height, tmp_viewport[i].MinDepth, tmp_viewport[i].MaxDepth, i);
1640 ID3D10Device_RSGetState(device, &tmp_rs_state);
1641 ok(!tmp_rs_state, "Got unexpected rasterizer state %p.\n", tmp_rs_state);
1643 ID3D10Device_SOGetTargets(device, D3D10_SO_BUFFER_SLOT_COUNT, tmp_buffer, offset);
1644 for (i = 0; i < D3D10_SO_BUFFER_SLOT_COUNT; ++i)
1646 ok(!tmp_buffer[i], "Got unexpected stream output %p in slot %u.\n", tmp_buffer[i], i);
1647 ok(offset[i] == ~0u, "Got unexpected stream output offset %u in slot %u.\n", offset[i], i);
1650 ID3D10Device_GetPredication(device, &tmp_predicate, &predicate_value);
1651 ok(!tmp_predicate, "Got unexpected predicate %p.\n", tmp_predicate);
1652 ok(!predicate_value, "Got unexpected predicate value %#x.\n", predicate_value);
1654 ID3D10Predicate_Release(predicate);
1655 ID3D10RasterizerState_Release(rs_state);
1656 ID3D10DepthStencilView_Release(dsv);
1657 ID3D10Texture2D_Release(ds_texture);
1659 for (i = 0; i < D3D10_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
1661 ID3D10RenderTargetView_Release(rtv[i]);
1662 ID3D10Texture2D_Release(rt_texture[i]);
1665 ID3D10DepthStencilState_Release(ds_state);
1666 ID3D10BlendState_Release(blend_state);
1667 ID3D10InputLayout_Release(input_layout);
1668 ID3D10VertexShader_Release(vs);
1669 ID3D10GeometryShader_Release(gs);
1670 ID3D10PixelShader_Release(ps);
1672 for (i = 0; i < D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)
1674 ID3D10SamplerState_Release(sampler[i]);
1677 for (i = 0; i < D3D10_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT; ++i)
1679 ID3D10ShaderResourceView_Release(srv[i]);
1682 for (i = 0; i < D3D10_SO_BUFFER_SLOT_COUNT; ++i)
1684 ID3D10Buffer_Release(so_buffer[i]);
1687 for (i = 0; i < D3D10_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; ++i)
1689 ID3D10Buffer_Release(buffer[i]);
1692 for (i = 0; i < D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; ++i)
1694 ID3D10Buffer_Release(cb[i]);
1697 refcount = ID3D10Device_Release(device);
1698 ok(!refcount, "Device has %u references left.\n", refcount);
1701 static void test_D3DX10CreateAsyncMemoryLoader(void)
1703 ID3DX10DataLoader *loader;
1704 SIZE_T size;
1705 DWORD data;
1706 HRESULT hr;
1707 void *ptr;
1709 hr = D3DX10CreateAsyncMemoryLoader(NULL, 0, NULL);
1710 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1712 hr = D3DX10CreateAsyncMemoryLoader(NULL, 0, &loader);
1713 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1715 hr = D3DX10CreateAsyncMemoryLoader(&data, 0, &loader);
1716 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1718 size = 100;
1719 hr = ID3DX10DataLoader_Decompress(loader, &ptr, &size);
1720 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1721 ok(ptr == &data, "Got data pointer %p, original %p.\n", ptr, &data);
1722 ok(!size, "Got unexpected data size.\n");
1724 /* Load() is no-op. */
1725 hr = ID3DX10DataLoader_Load(loader);
1726 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1728 hr = ID3DX10DataLoader_Destroy(loader);
1729 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1731 data = 0;
1732 hr = D3DX10CreateAsyncMemoryLoader(&data, sizeof(data), &loader);
1733 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1735 /* Load() is no-op. */
1736 hr = ID3DX10DataLoader_Load(loader);
1737 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1739 hr = ID3DX10DataLoader_Decompress(loader, &ptr, &size);
1740 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1741 ok(ptr == &data, "Got data pointer %p, original %p.\n", ptr, &data);
1742 ok(size == sizeof(data), "Got unexpected data size.\n");
1744 hr = ID3DX10DataLoader_Destroy(loader);
1745 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1748 static void test_D3DX10CreateAsyncFileLoader(void)
1750 static const WCHAR test_filename[] = L"asyncloader.data";
1751 static const char test_data1[] = "test data";
1752 static const char test_data2[] = "more test data";
1753 ID3DX10DataLoader *loader;
1754 WCHAR path[MAX_PATH];
1755 SIZE_T size;
1756 HRESULT hr;
1757 void *ptr;
1758 BOOL ret;
1760 hr = D3DX10CreateAsyncFileLoaderA(NULL, NULL);
1761 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1763 hr = D3DX10CreateAsyncFileLoaderA(NULL, &loader);
1764 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1766 hr = D3DX10CreateAsyncFileLoaderA("nonexistentfilename", &loader);
1767 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1769 hr = ID3DX10DataLoader_Decompress(loader, &ptr, &size);
1770 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1772 hr = ID3DX10DataLoader_Load(loader);
1773 ok(hr == D3D10_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
1775 hr = ID3DX10DataLoader_Decompress(loader, &ptr, &size);
1776 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1778 hr = ID3DX10DataLoader_Destroy(loader);
1779 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1781 /* Test file sharing using dummy empty file. */
1782 create_file(test_filename, test_data1, sizeof(test_data1), path);
1784 hr = D3DX10CreateAsyncFileLoaderW(path, &loader);
1785 ok(SUCCEEDED(hr), "Failed to create file loader, hr %#x.\n", hr);
1787 ret = delete_file(test_filename);
1788 ok(ret, "DeleteFile() failed, ret %d, error %d.\n", ret, GetLastError());
1790 /* File was removed before Load(). */
1791 hr = ID3DX10DataLoader_Load(loader);
1792 ok(hr == D3D10_ERROR_FILE_NOT_FOUND, "Load() returned unexpected result, hr %#x.\n", hr);
1794 /* Create it again. */
1795 create_file(test_filename, test_data1, sizeof(test_data1), NULL);
1796 hr = ID3DX10DataLoader_Load(loader);
1797 ok(SUCCEEDED(hr), "Load() failed, hr %#x.\n", hr);
1799 /* Already loaded. */
1800 hr = ID3DX10DataLoader_Load(loader);
1801 ok(SUCCEEDED(hr), "Load() failed, hr %#x.\n", hr);
1803 ret = delete_file(test_filename);
1804 ok(ret, "DeleteFile() failed, ret %d, error %d.\n", ret, GetLastError());
1806 /* Already loaded, file removed. */
1807 hr = ID3DX10DataLoader_Load(loader);
1808 ok(hr == D3D10_ERROR_FILE_NOT_FOUND, "Load() returned unexpected result, hr %#x.\n", hr);
1810 /* Decompress still works. */
1811 ptr = NULL;
1812 hr = ID3DX10DataLoader_Decompress(loader, &ptr, &size);
1813 ok(SUCCEEDED(hr), "Decompress() failed, hr %#x.\n", hr);
1814 ok(ptr != NULL, "Got unexpected ptr %p.\n", ptr);
1815 ok(size == sizeof(test_data1), "Got unexpected decompressed size.\n");
1816 if (size == sizeof(test_data1))
1817 ok(!memcmp(ptr, test_data1, size), "Got unexpected file data.\n");
1819 /* Create it again, with different data. */
1820 create_file(test_filename, test_data2, sizeof(test_data2), NULL);
1822 hr = ID3DX10DataLoader_Load(loader);
1823 ok(SUCCEEDED(hr), "Load() failed, hr %#x.\n", hr);
1825 ptr = NULL;
1826 hr = ID3DX10DataLoader_Decompress(loader, &ptr, &size);
1827 ok(SUCCEEDED(hr), "Decompress() failed, hr %#x.\n", hr);
1828 ok(ptr != NULL, "Got unexpected ptr %p.\n", ptr);
1829 ok(size == sizeof(test_data2), "Got unexpected decompressed size.\n");
1830 if (size == sizeof(test_data2))
1831 ok(!memcmp(ptr, test_data2, size), "Got unexpected file data.\n");
1833 hr = ID3DX10DataLoader_Destroy(loader);
1834 ok(SUCCEEDED(hr), "Destroy() failed, hr %#x.\n", hr);
1836 ret = delete_file(test_filename);
1837 ok(ret, "DeleteFile() failed, ret %d, error %d.\n", ret, GetLastError());
1840 static void test_D3DX10CreateAsyncResourceLoader(void)
1842 ID3DX10DataLoader *loader;
1843 HRESULT hr;
1845 hr = D3DX10CreateAsyncResourceLoaderA(NULL, NULL, NULL);
1846 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1848 hr = D3DX10CreateAsyncResourceLoaderA(NULL, NULL, &loader);
1849 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1851 hr = D3DX10CreateAsyncResourceLoaderA(NULL, "noname", &loader);
1852 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1854 hr = D3DX10CreateAsyncResourceLoaderW(NULL, NULL, NULL);
1855 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1857 hr = D3DX10CreateAsyncResourceLoaderW(NULL, NULL, &loader);
1858 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1860 hr = D3DX10CreateAsyncResourceLoaderW(NULL, L"noname", &loader);
1861 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1864 static void test_get_image_info(void)
1866 static const WCHAR test_resource_name[] = L"resource.data";
1867 static const WCHAR test_filename[] = L"image.data";
1868 D3DX10_IMAGE_INFO image_info;
1869 HMODULE resource_module;
1870 WCHAR path[MAX_PATH];
1871 unsigned int i;
1872 DWORD dword;
1873 HRESULT hr;
1875 CoInitialize(NULL);
1877 hr = D3DX10GetImageInfoFromMemory(test_image[0].data, 0, NULL, &image_info, NULL);
1878 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1879 hr = D3DX10GetImageInfoFromMemory(NULL, test_image[0].size, NULL, &image_info, NULL);
1880 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1881 hr = D3DX10GetImageInfoFromMemory(&dword, sizeof(dword), NULL, &image_info, NULL);
1882 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1884 for (i = 0; i < ARRAY_SIZE(test_image); ++i)
1886 winetest_push_context("Test %u", i);
1888 hr = D3DX10GetImageInfoFromMemory(test_image[i].data, test_image[i].size, NULL, &image_info, NULL);
1889 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1890 if (hr == S_OK)
1891 check_image_info(&image_info, test_image + i, __LINE__);
1893 winetest_pop_context();
1896 hr = D3DX10GetImageInfoFromFileW(NULL, NULL, &image_info, NULL);
1897 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1898 hr = D3DX10GetImageInfoFromFileW(L"deadbeaf", NULL, &image_info, NULL);
1899 ok(hr == D3D10_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
1900 hr = D3DX10GetImageInfoFromFileA(NULL, NULL, &image_info, NULL);
1901 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1902 hr = D3DX10GetImageInfoFromFileA("deadbeaf", NULL, &image_info, NULL);
1903 ok(hr == D3D10_ERROR_FILE_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
1905 for (i = 0; i < ARRAY_SIZE(test_image); ++i)
1907 winetest_push_context("Test %u", i);
1908 create_file(test_filename, test_image[i].data, test_image[i].size, path);
1910 hr = D3DX10GetImageInfoFromFileW(path, NULL, &image_info, NULL);
1911 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1912 if (hr == S_OK)
1913 check_image_info(&image_info, test_image + i, __LINE__);
1915 hr = D3DX10GetImageInfoFromFileA(get_str_a(path), NULL, &image_info, NULL);
1916 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1917 if (hr == S_OK)
1918 check_image_info(&image_info, test_image + i, __LINE__);
1920 delete_file(test_filename);
1921 winetest_pop_context();
1925 /* D3DX10GetImageInfoFromResource tests */
1927 hr = D3DX10GetImageInfoFromResourceW(NULL, NULL, NULL, &image_info, NULL);
1928 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1929 hr = D3DX10GetImageInfoFromResourceW(NULL, L"deadbeaf", NULL, &image_info, NULL);
1930 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1931 hr = D3DX10GetImageInfoFromResourceA(NULL, NULL, NULL, &image_info, NULL);
1932 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1933 hr = D3DX10GetImageInfoFromResourceA(NULL, "deadbeaf", NULL, &image_info, NULL);
1934 ok(hr == D3DX10_ERR_INVALID_DATA, "Got unexpected hr %#x.\n", hr);
1936 for (i = 0; i < ARRAY_SIZE(test_image); ++i)
1938 winetest_push_context("Test %u", i);
1939 resource_module = create_resource_module(test_resource_name, test_image[i].data, test_image[i].size);
1941 hr = D3DX10GetImageInfoFromResourceW(resource_module, test_resource_name, NULL, &image_info, NULL);
1942 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1943 if (hr == S_OK)
1944 check_image_info(&image_info, test_image + i, __LINE__);
1946 hr = D3DX10GetImageInfoFromResourceA(resource_module, get_str_a(test_resource_name), NULL, &image_info, NULL);
1947 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
1948 if (hr == S_OK)
1949 check_image_info(&image_info, test_image + i, __LINE__);
1951 delete_resource_module(test_resource_name, resource_module);
1952 winetest_pop_context();
1955 CoUninitialize();
1958 static void test_create_texture(void)
1960 ID3D10Resource *resource;
1961 ID3D10Device *device;
1962 unsigned int i;
1963 HRESULT hr;
1965 device = create_device();
1966 if (!device)
1968 skip("Failed to create device, skipping tests.\n");
1969 return;
1972 CoInitialize(NULL);
1974 /* D3DX10CreateTextureFromMemory tests */
1976 resource = (ID3D10Resource *)0xdeadbeef;
1977 hr = D3DX10CreateTextureFromMemory(device, NULL, 0, NULL, NULL, &resource, NULL);
1978 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1979 ok(resource == (ID3D10Resource *)0xdeadbeef, "Got unexpected resource %p.\n", resource);
1981 resource = (ID3D10Resource *)0xdeadbeef;
1982 hr = D3DX10CreateTextureFromMemory(device, NULL, sizeof(test_bmp_1bpp), NULL, NULL, &resource, NULL);
1983 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1984 ok(resource == (ID3D10Resource *)0xdeadbeef, "Got unexpected resource %p.\n", resource);
1986 resource = (ID3D10Resource *)0xdeadbeef;
1987 hr = D3DX10CreateTextureFromMemory(device, test_bmp_1bpp, 0, NULL, NULL, &resource, NULL);
1988 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1989 ok(resource == (ID3D10Resource *)0xdeadbeef, "Got unexpected resource %p.\n", resource);
1991 resource = (ID3D10Resource *)0xdeadbeef;
1992 hr = D3DX10CreateTextureFromMemory(device, test_bmp_1bpp, sizeof(test_bmp_1bpp) - 1, NULL, NULL, &resource, NULL);
1993 ok(hr == E_FAIL, "Got unexpected hr %#x.\n", hr);
1994 ok(resource == (ID3D10Resource *)0xdeadbeef, "Got unexpected resource %p.\n", resource);
1996 for (i = 0; i < ARRAY_SIZE(test_image); ++i)
1998 winetest_push_context("Test %u", i);
2000 hr = D3DX10CreateTextureFromMemory(device, test_image[i].data, test_image[i].size, NULL, NULL, &resource, NULL);
2001 todo_wine_if(test_image[i].expected_info.Format != DXGI_FORMAT_R8G8B8A8_UNORM)
2002 ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
2003 if (hr == S_OK)
2005 check_resource_info(resource, test_image + i, __LINE__);
2006 check_resource_data(resource, test_image + i, __LINE__);
2007 ID3D10Resource_Release(resource);
2010 winetest_pop_context();
2013 CoUninitialize();
2015 ID3D10Device_Release(device);
2018 START_TEST(d3dx10)
2020 test_D3DX10UnsetAllDeviceObjects();
2021 test_D3DX10CreateAsyncMemoryLoader();
2022 test_D3DX10CreateAsyncFileLoader();
2023 test_D3DX10CreateAsyncResourceLoader();
2024 test_get_image_info();
2025 test_create_texture();