2 * Copyright 2011 Joakim Sindholt <opensource@zhasha.com>
3 * Copyright 2013 Christoph Bumiller
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * on the rights to use, copy, modify, merge, publish, distribute, sub
9 * license, and/or sell copies of the Software, and to permit persons to whom
10 * the Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22 * USE OR OTHER DEALINGS IN THE SOFTWARE. */
25 #include "nine_pipe.h"
27 #include "cso_cache/cso_context.h"
30 nine_convert_dsa_state(struct cso_context
*ctx
, const DWORD
*rs
)
32 struct pipe_depth_stencil_alpha_state dsa
;
34 memset(&dsa
, 0, sizeof(dsa
)); /* memcmp safety */
36 if (rs
[D3DRS_ZENABLE
]) {
37 dsa
.depth
.enabled
= 1;
38 dsa
.depth
.writemask
= !!rs
[D3DRS_ZWRITEENABLE
];
39 dsa
.depth
.func
= d3dcmpfunc_to_pipe_func(rs
[D3DRS_ZFUNC
]);
42 if (rs
[D3DRS_STENCILENABLE
]) {
43 dsa
.stencil
[0].enabled
= 1;
44 dsa
.stencil
[0].func
= d3dcmpfunc_to_pipe_func(rs
[D3DRS_STENCILFUNC
]);
45 dsa
.stencil
[0].fail_op
= d3dstencilop_to_pipe_stencil_op(rs
[D3DRS_STENCILFAIL
]);
46 dsa
.stencil
[0].zpass_op
= d3dstencilop_to_pipe_stencil_op(rs
[D3DRS_STENCILPASS
]);
47 dsa
.stencil
[0].zfail_op
= d3dstencilop_to_pipe_stencil_op(rs
[D3DRS_STENCILZFAIL
]);
48 dsa
.stencil
[0].valuemask
= rs
[D3DRS_STENCILMASK
];
49 dsa
.stencil
[0].writemask
= rs
[D3DRS_STENCILWRITEMASK
];
51 if (rs
[D3DRS_TWOSIDEDSTENCILMODE
]) {
52 dsa
.stencil
[1].enabled
= 1;
53 dsa
.stencil
[1].func
= d3dcmpfunc_to_pipe_func(rs
[D3DRS_CCW_STENCILFUNC
]);
54 dsa
.stencil
[1].fail_op
= d3dstencilop_to_pipe_stencil_op(rs
[D3DRS_CCW_STENCILFAIL
]);
55 dsa
.stencil
[1].zpass_op
= d3dstencilop_to_pipe_stencil_op(rs
[D3DRS_CCW_STENCILPASS
]);
56 dsa
.stencil
[1].zfail_op
= d3dstencilop_to_pipe_stencil_op(rs
[D3DRS_CCW_STENCILZFAIL
]);
57 dsa
.stencil
[1].valuemask
= dsa
.stencil
[0].valuemask
;
58 dsa
.stencil
[1].writemask
= dsa
.stencil
[0].writemask
;
62 if (rs
[D3DRS_ALPHATESTENABLE
]) {
63 dsa
.alpha
.enabled
= 1;
64 dsa
.alpha
.func
= d3dcmpfunc_to_pipe_func(rs
[D3DRS_ALPHAFUNC
]);
65 dsa
.alpha
.ref_value
= (float)rs
[D3DRS_ALPHAREF
] / 255.0f
;
68 cso_set_depth_stencil_alpha(ctx
, &dsa
);
71 /* TODO: Keep a static copy in device so we don't have to memset every time ? */
73 nine_convert_rasterizer_state(struct cso_context
*ctx
, const DWORD
*rs
)
75 struct pipe_rasterizer_state rast
;
77 memset(&rast
, 0, sizeof(rast
)); /* memcmp safety */
79 rast
.flatshade
= rs
[D3DRS_SHADEMODE
] == D3DSHADE_FLAT
;
80 /* rast.light_twoside = 0; */
81 /* rast.clamp_fragment_color = 0; */
82 /* rast.clamp_vertex_color = 0; */
83 /* rast.front_ccw = 0; */
84 rast
.cull_face
= d3dcull_to_pipe_face(rs
[D3DRS_CULLMODE
]);
85 rast
.fill_front
= d3dfillmode_to_pipe_polygon_mode(rs
[D3DRS_FILLMODE
]);
86 rast
.fill_back
= rast
.fill_front
;
87 rast
.offset_tri
= !!(rs
[D3DRS_DEPTHBIAS
] | rs
[D3DRS_SLOPESCALEDEPTHBIAS
]);
88 rast
.offset_line
= rast
.offset_tri
; /* triangles in wireframe mode */
89 rast
.offset_point
= 0; /* XXX ? */
90 rast
.scissor
= !!rs
[D3DRS_SCISSORTESTENABLE
];
91 /* rast.poly_smooth = 0; */
92 /* rast.poly_stipple_enable = 0; */
93 /* rast.point_smooth = 0; */
94 rast
.sprite_coord_mode
= PIPE_SPRITE_COORD_UPPER_LEFT
;
95 rast
.point_quad_rasterization
= 1;
96 rast
.point_size_per_vertex
= rs
[NINED3DRS_VSPOINTSIZE
];
97 rast
.multisample
= !!rs
[D3DRS_MULTISAMPLEANTIALIAS
];
98 rast
.line_smooth
= !!rs
[D3DRS_ANTIALIASEDLINEENABLE
];
99 /* rast.line_stipple_enable = 0; */
100 rast
.line_last_pixel
= !!rs
[D3DRS_LASTPIXEL
];
101 rast
.flatshade_first
= 1;
102 /* rast.half_pixel_center = 0; */
103 /* rast.lower_left_origin = 0; */
104 /* rast.bottom_edge_rule = 0; */
105 /* rast.rasterizer_discard = 0; */
108 rast
.clip_plane_enable
= rs
[D3DRS_CLIPPLANEENABLE
];
109 /* rast.line_stipple_factor = 0; */
110 /* rast.line_stipple_pattern = 0; */
111 rast
.sprite_coord_enable
= rs
[D3DRS_POINTSPRITEENABLE
] ? 0xff : 0x00;
112 rast
.line_width
= 1.0f
;
113 if (rs
[NINED3DRS_VSPOINTSIZE
]) {
114 rast
.point_size
= 1.0f
;
116 rast
.point_size
= CLAMP(asfloat(rs
[D3DRS_POINTSIZE
]),
117 asfloat(rs
[D3DRS_POINTSIZE_MIN
]),
118 asfloat(rs
[D3DRS_POINTSIZE_MAX
]));
120 rast
.offset_units
= asfloat(rs
[D3DRS_DEPTHBIAS
]) * asfloat(rs
[NINED3DRS_ZBIASSCALE
]);
121 rast
.offset_scale
= asfloat(rs
[D3DRS_SLOPESCALEDEPTHBIAS
]);
122 /* rast.offset_clamp = 0.0f; */
124 cso_set_rasterizer(ctx
, &rast
);
128 nine_convert_blend_state_fixup(struct pipe_blend_state
*blend
, const DWORD
*rs
)
130 if (unlikely(rs
[D3DRS_SRCBLEND
] == D3DBLEND_BOTHSRCALPHA
||
131 rs
[D3DRS_SRCBLEND
] == D3DBLEND_BOTHINVSRCALPHA
)) {
132 blend
->rt
[0].rgb_dst_factor
= (rs
[D3DRS_SRCBLEND
] == D3DBLEND_BOTHSRCALPHA
) ?
133 PIPE_BLENDFACTOR_INV_SRC_ALPHA
: PIPE_BLENDFACTOR_SRC_ALPHA
;
134 if (!rs
[D3DRS_SEPARATEALPHABLENDENABLE
])
135 blend
->rt
[0].alpha_dst_factor
= blend
->rt
[0].rgb_dst_factor
;
137 if (unlikely(rs
[D3DRS_SEPARATEALPHABLENDENABLE
] &&
138 (rs
[D3DRS_SRCBLENDALPHA
] == D3DBLEND_BOTHSRCALPHA
||
139 rs
[D3DRS_SRCBLENDALPHA
] == D3DBLEND_BOTHINVSRCALPHA
))) {
140 blend
->rt
[0].alpha_dst_factor
= (rs
[D3DRS_SRCBLENDALPHA
] == D3DBLEND_BOTHSRCALPHA
) ?
141 PIPE_BLENDFACTOR_INV_SRC_ALPHA
: PIPE_BLENDFACTOR_SRC_ALPHA
;
146 nine_convert_blend_state(struct cso_context
*ctx
, const DWORD
*rs
)
148 struct pipe_blend_state blend
;
150 memset(&blend
, 0, sizeof(blend
)); /* memcmp safety */
152 blend
.dither
= !!rs
[D3DRS_DITHERENABLE
];
154 /* blend.alpha_to_one = 0; */
155 blend
.alpha_to_coverage
= !!rs
[NINED3DRS_ALPHACOVERAGE
];
157 blend
.rt
[0].blend_enable
= !!rs
[D3DRS_ALPHABLENDENABLE
];
158 if (blend
.rt
[0].blend_enable
) {
159 blend
.rt
[0].rgb_func
= d3dblendop_to_pipe_blend(rs
[D3DRS_BLENDOP
]);
160 blend
.rt
[0].rgb_src_factor
= d3dblend_color_to_pipe_blendfactor(rs
[D3DRS_SRCBLEND
]);
161 blend
.rt
[0].rgb_dst_factor
= d3dblend_color_to_pipe_blendfactor(rs
[D3DRS_DESTBLEND
]);
162 if (rs
[D3DRS_SEPARATEALPHABLENDENABLE
]) {
163 blend
.rt
[0].alpha_func
= d3dblendop_to_pipe_blend(rs
[D3DRS_BLENDOPALPHA
]);
164 blend
.rt
[0].alpha_src_factor
= d3dblend_alpha_to_pipe_blendfactor(rs
[D3DRS_SRCBLENDALPHA
]);
165 blend
.rt
[0].alpha_dst_factor
= d3dblend_alpha_to_pipe_blendfactor(rs
[D3DRS_DESTBLENDALPHA
]);
167 /* TODO: Just copy the rgb values ? SRC1_x may differ ... */
168 blend
.rt
[0].alpha_func
= blend
.rt
[0].rgb_func
;
169 blend
.rt
[0].alpha_src_factor
= d3dblend_alpha_to_pipe_blendfactor(rs
[D3DRS_SRCBLEND
]);
170 blend
.rt
[0].alpha_dst_factor
= d3dblend_alpha_to_pipe_blendfactor(rs
[D3DRS_DESTBLEND
]);
172 nine_convert_blend_state_fixup(&blend
, rs
); /* for BOTH[INV]SRCALPHA */
174 blend
.rt
[0].colormask
= rs
[D3DRS_COLORWRITEENABLE
];
176 if (rs
[D3DRS_COLORWRITEENABLE1
] != rs
[D3DRS_COLORWRITEENABLE
] ||
177 rs
[D3DRS_COLORWRITEENABLE2
] != rs
[D3DRS_COLORWRITEENABLE
] ||
178 rs
[D3DRS_COLORWRITEENABLE3
] != rs
[D3DRS_COLORWRITEENABLE
]) {
180 blend
.independent_blend_enable
= TRUE
;
181 for (i
= 1; i
< 4; ++i
)
182 blend
.rt
[i
] = blend
.rt
[0];
183 blend
.rt
[1].colormask
= rs
[D3DRS_COLORWRITEENABLE1
];
184 blend
.rt
[2].colormask
= rs
[D3DRS_COLORWRITEENABLE2
];
185 blend
.rt
[3].colormask
= rs
[D3DRS_COLORWRITEENABLE3
];
188 /* blend.force_srgb = !!rs[D3DRS_SRGBWRITEENABLE]; */
190 cso_set_blend(ctx
, &blend
);
194 nine_convert_sampler_state(struct cso_context
*ctx
, int idx
, const DWORD
*ss
)
196 struct pipe_sampler_state samp
;
199 (idx
< NINE_MAX_SAMPLERS_PS
|| idx
>= NINE_SAMPLER_VS(0)) &&
200 (idx
< NINE_MAX_SAMPLERS
));
202 memset(&samp
, 0, sizeof(samp
)); /* memcmp safety */
204 if (ss
[D3DSAMP_MIPFILTER
] != D3DTEXF_NONE
) {
205 samp
.lod_bias
= asfloat(ss
[D3DSAMP_MIPMAPLODBIAS
]);
206 samp
.min_lod
= ss
[NINED3DSAMP_MINLOD
];
207 samp
.min_mip_filter
= (ss
[D3DSAMP_MIPFILTER
] == D3DTEXF_POINT
) ? PIPE_TEX_FILTER_NEAREST
: PIPE_TEX_FILTER_LINEAR
;
209 samp
.min_mip_filter
= PIPE_TEX_MIPFILTER_NONE
;
211 samp
.max_lod
= 15.0f
;
212 samp
.wrap_s
= d3dtextureaddress_to_pipe_tex_wrap(ss
[D3DSAMP_ADDRESSU
]);
213 samp
.wrap_t
= d3dtextureaddress_to_pipe_tex_wrap(ss
[D3DSAMP_ADDRESSV
]);
214 samp
.wrap_r
= d3dtextureaddress_to_pipe_tex_wrap(ss
[D3DSAMP_ADDRESSW
]);
215 samp
.min_img_filter
= ss
[D3DSAMP_MINFILTER
] == D3DTEXF_POINT
? PIPE_TEX_FILTER_NEAREST
: PIPE_TEX_FILTER_LINEAR
;
216 samp
.mag_img_filter
= ss
[D3DSAMP_MAGFILTER
] == D3DTEXF_POINT
? PIPE_TEX_FILTER_NEAREST
: PIPE_TEX_FILTER_LINEAR
;
217 if (ss
[D3DSAMP_MINFILTER
] == D3DTEXF_ANISOTROPIC
||
218 ss
[D3DSAMP_MAGFILTER
] == D3DTEXF_ANISOTROPIC
)
219 samp
.max_anisotropy
= ss
[D3DSAMP_MAXANISOTROPY
];
220 samp
.compare_mode
= ss
[NINED3DSAMP_SHADOW
] ? PIPE_TEX_COMPARE_R_TO_TEXTURE
: PIPE_TEX_COMPARE_NONE
;
221 samp
.compare_func
= PIPE_FUNC_LEQUAL
;
222 samp
.normalized_coords
= 1;
223 samp
.seamless_cube_map
= 1;
224 d3dcolor_to_pipe_color_union(&samp
.border_color
, ss
[D3DSAMP_BORDERCOLOR
]);
226 /* see nine_state.h */
227 if (idx
< NINE_MAX_SAMPLERS_PS
)
228 cso_single_sampler(ctx
, PIPE_SHADER_FRAGMENT
, idx
- NINE_SAMPLER_PS(0), &samp
);
230 cso_single_sampler(ctx
, PIPE_SHADER_VERTEX
, idx
- NINE_SAMPLER_VS(0), &samp
);
234 nine_pipe_context_clear(struct NineDevice9
*This
)
236 struct pipe_context
*pipe
= This
->pipe
;
237 struct cso_context
*cso
= This
->cso
;
238 pipe
->bind_vs_state(pipe
, NULL
);
239 pipe
->bind_fs_state(pipe
, NULL
);
241 /* Don't unbind constant buffers, they're device-private and
242 * do not change on Reset.
245 cso_set_samplers(cso
, PIPE_SHADER_VERTEX
, 0, NULL
);
246 cso_set_samplers(cso
, PIPE_SHADER_FRAGMENT
, 0, NULL
);
248 pipe
->set_sampler_views(pipe
, PIPE_SHADER_FRAGMENT
, 0, 0, NULL
);
249 pipe
->set_sampler_views(pipe
, PIPE_SHADER_VERTEX
, 0, 0, NULL
);
251 pipe
->set_vertex_buffers(pipe
, 0, This
->caps
.MaxStreams
, NULL
);
252 pipe
->set_index_buffer(pipe
, NULL
);
255 const enum pipe_format nine_d3d9_to_pipe_format_map
[120] =
257 [D3DFMT_UNKNOWN
] = PIPE_FORMAT_NONE
,
258 [D3DFMT_R8G8B8
] = PIPE_FORMAT_NONE
,
259 [D3DFMT_A8R8G8B8
] = PIPE_FORMAT_B8G8R8A8_UNORM
,
260 [D3DFMT_X8R8G8B8
] = PIPE_FORMAT_B8G8R8X8_UNORM
,
261 [D3DFMT_R5G6B5
] = PIPE_FORMAT_B5G6R5_UNORM
,
262 [D3DFMT_X1R5G5B5
] = PIPE_FORMAT_B5G5R5X1_UNORM
,
263 [D3DFMT_A1R5G5B5
] = PIPE_FORMAT_B5G5R5A1_UNORM
,
264 [D3DFMT_A4R4G4B4
] = PIPE_FORMAT_B4G4R4A4_UNORM
,
265 [D3DFMT_R3G3B2
] = PIPE_FORMAT_B2G3R3_UNORM
,
266 [D3DFMT_A8
] = PIPE_FORMAT_A8_UNORM
,
267 [D3DFMT_A8R3G3B2
] = PIPE_FORMAT_NONE
,
268 [D3DFMT_X4R4G4B4
] = PIPE_FORMAT_B4G4R4X4_UNORM
,
269 [D3DFMT_A2B10G10R10
] = PIPE_FORMAT_R10G10B10A2_UNORM
,
270 [D3DFMT_A8B8G8R8
] = PIPE_FORMAT_R8G8B8A8_UNORM
,
271 [D3DFMT_X8B8G8R8
] = PIPE_FORMAT_R8G8B8X8_UNORM
,
272 [D3DFMT_G16R16
] = PIPE_FORMAT_R16G16_UNORM
,
273 [D3DFMT_A2R10G10B10
] = PIPE_FORMAT_B10G10R10A2_UNORM
,
274 [D3DFMT_A16B16G16R16
] = PIPE_FORMAT_R16G16B16A16_UNORM
,
275 [D3DFMT_A8P8
] = PIPE_FORMAT_NONE
,
276 [D3DFMT_P8
] = PIPE_FORMAT_NONE
,
277 [D3DFMT_L8
] = PIPE_FORMAT_L8_UNORM
,
278 [D3DFMT_A8L8
] = PIPE_FORMAT_L8A8_UNORM
,
279 [D3DFMT_A4L4
] = PIPE_FORMAT_L4A4_UNORM
,
280 [D3DFMT_V8U8
] = PIPE_FORMAT_R8G8_SNORM
,
281 [D3DFMT_L6V5U5
] = PIPE_FORMAT_NONE
,
282 [D3DFMT_X8L8V8U8
] = PIPE_FORMAT_NONE
,
283 [D3DFMT_Q8W8V8U8
] = PIPE_FORMAT_R8G8B8A8_SNORM
,
284 [D3DFMT_V16U16
] = PIPE_FORMAT_R16G16_SNORM
,
285 [D3DFMT_A2W10V10U10
] = PIPE_FORMAT_R10SG10SB10SA2U_NORM
,
286 [D3DFMT_D16_LOCKABLE
] = PIPE_FORMAT_Z16_UNORM
,
287 [D3DFMT_D32
] = PIPE_FORMAT_Z32_UNORM
,
288 [D3DFMT_D15S1
] = PIPE_FORMAT_Z24_UNORM_S8_UINT
,
289 [D3DFMT_D24S8
] = PIPE_FORMAT_S8_UINT_Z24_UNORM
,
290 [D3DFMT_D24X8
] = PIPE_FORMAT_X8Z24_UNORM
,
291 [D3DFMT_D24X4S4
] = PIPE_FORMAT_Z24_UNORM_S8_UINT
,
292 [D3DFMT_D16
] = PIPE_FORMAT_Z16_UNORM
,
293 [D3DFMT_D32F_LOCKABLE
] = PIPE_FORMAT_Z32_FLOAT
,
294 [D3DFMT_D24FS8
] = PIPE_FORMAT_Z32_FLOAT_S8X24_UINT
,
295 [D3DFMT_D32_LOCKABLE
] = PIPE_FORMAT_NONE
,
296 [D3DFMT_S8_LOCKABLE
] = PIPE_FORMAT_NONE
,
297 [D3DFMT_L16
] = PIPE_FORMAT_L16_UNORM
,
298 [D3DFMT_VERTEXDATA
] = PIPE_FORMAT_NONE
,
299 [D3DFMT_INDEX16
] = PIPE_FORMAT_R16_UINT
,
300 [D3DFMT_INDEX32
] = PIPE_FORMAT_R32_UINT
,
301 [D3DFMT_Q16W16V16U16
] = PIPE_FORMAT_R16G16B16A16_SNORM
,
302 [D3DFMT_R16F
] = PIPE_FORMAT_R16_FLOAT
,
303 [D3DFMT_G16R16F
] = PIPE_FORMAT_R16G16_FLOAT
,
304 [D3DFMT_A16B16G16R16F
] = PIPE_FORMAT_R16G16B16A16_FLOAT
,
305 [D3DFMT_R32F
] = PIPE_FORMAT_R32_FLOAT
,
306 [D3DFMT_G32R32F
] = PIPE_FORMAT_R32G32_FLOAT
,
307 [D3DFMT_A32B32G32R32F
] = PIPE_FORMAT_R32G32B32A32_FLOAT
,
308 [D3DFMT_CxV8U8
] = PIPE_FORMAT_NONE
,
309 [D3DFMT_A1
] = PIPE_FORMAT_NONE
,
310 [D3DFMT_A2B10G10R10_XR_BIAS
] = PIPE_FORMAT_NONE
,
313 const D3DFORMAT nine_pipe_to_d3d9_format_map
[PIPE_FORMAT_COUNT
] =
315 [PIPE_FORMAT_NONE
] = D3DFMT_UNKNOWN
,
317 /* [PIPE_FORMAT_B8G8R8_UNORM] = D3DFMT_R8G8B8, */
318 [PIPE_FORMAT_B8G8R8A8_UNORM
] = D3DFMT_A8R8G8B8
,
319 [PIPE_FORMAT_B8G8R8X8_UNORM
] = D3DFMT_X8R8G8B8
,
320 [PIPE_FORMAT_B5G6R5_UNORM
] = D3DFMT_R5G6B5
,
321 [PIPE_FORMAT_B5G5R5X1_UNORM
] = D3DFMT_X1R5G5B5
,
322 [PIPE_FORMAT_B5G5R5A1_UNORM
] = D3DFMT_A1R5G5B5
,
323 [PIPE_FORMAT_B4G4R4A4_UNORM
] = D3DFMT_A4R4G4B4
,
324 [PIPE_FORMAT_B2G3R3_UNORM
] = D3DFMT_R3G3B2
,
325 [PIPE_FORMAT_A8_UNORM
] = D3DFMT_A8
,
326 /* [PIPE_FORMAT_B2G3R3A8_UNORM] = D3DFMT_A8R3G3B2, */
327 [PIPE_FORMAT_B4G4R4X4_UNORM
] = D3DFMT_X4R4G4B4
,
328 [PIPE_FORMAT_R10G10B10A2_UNORM
] = D3DFMT_A2B10G10R10
,
329 [PIPE_FORMAT_R8G8B8A8_UNORM
] = D3DFMT_A8B8G8R8
,
330 [PIPE_FORMAT_R8G8B8X8_UNORM
] = D3DFMT_X8B8G8R8
,
331 [PIPE_FORMAT_R16G16_UNORM
] = D3DFMT_G16R16
,
332 [PIPE_FORMAT_B10G10R10A2_UNORM
] = D3DFMT_A2R10G10B10
,
333 [PIPE_FORMAT_R16G16B16A16_UNORM
] = D3DFMT_A16B16G16R16
,
335 [PIPE_FORMAT_R8_UINT
] = D3DFMT_P8
,
336 [PIPE_FORMAT_R8A8_UINT
] = D3DFMT_A8P8
,
338 [PIPE_FORMAT_L8_UNORM
] = D3DFMT_L8
,
339 [PIPE_FORMAT_L8A8_UNORM
] = D3DFMT_A8L8
,
340 [PIPE_FORMAT_L4A4_UNORM
] = D3DFMT_A4L4
,
342 [PIPE_FORMAT_R8G8_SNORM
] = D3DFMT_V8U8
,
343 /* [PIPE_FORMAT_?] = D3DFMT_L6V5U5, */
344 /* [PIPE_FORMAT_?] = D3DFMT_X8L8V8U8, */
345 [PIPE_FORMAT_R8G8B8A8_SNORM
] = D3DFMT_Q8W8V8U8
,
346 [PIPE_FORMAT_R16G16_SNORM
] = D3DFMT_V16U16
,
347 [PIPE_FORMAT_R10SG10SB10SA2U_NORM
] = D3DFMT_A2W10V10U10
,
349 [PIPE_FORMAT_YUYV
] = D3DFMT_UYVY
,
350 /* [PIPE_FORMAT_YUY2] = D3DFMT_YUY2, */
351 [PIPE_FORMAT_DXT1_RGBA
] = D3DFMT_DXT1
,
352 /* [PIPE_FORMAT_DXT2_RGBA] = D3DFMT_DXT2, */
353 [PIPE_FORMAT_DXT3_RGBA
] = D3DFMT_DXT3
,
354 /* [PIPE_FORMAT_DXT4_RGBA] = D3DFMT_DXT4, */
355 [PIPE_FORMAT_DXT5_RGBA
] = D3DFMT_DXT5
,
356 /* [PIPE_FORMAT_?] = D3DFMT_MULTI2_ARGB8, (MET) */
357 [PIPE_FORMAT_R8G8_B8G8_UNORM
] = D3DFMT_R8G8_B8G8
, /* XXX: order */
358 [PIPE_FORMAT_G8R8_G8B8_UNORM
] = D3DFMT_G8R8_G8B8
,
360 [PIPE_FORMAT_Z16_UNORM
] = D3DFMT_D16_LOCKABLE
,
361 [PIPE_FORMAT_Z32_UNORM
] = D3DFMT_D32
,
362 /* [PIPE_FORMAT_Z15_UNORM_S1_UINT] = D3DFMT_D15S1, */
363 [PIPE_FORMAT_S8_UINT_Z24_UNORM
] = D3DFMT_D24S8
,
364 [PIPE_FORMAT_X8Z24_UNORM
] = D3DFMT_D24X8
,
365 [PIPE_FORMAT_L16_UNORM
] = D3DFMT_L16
,
366 [PIPE_FORMAT_Z32_FLOAT
] = D3DFMT_D32F_LOCKABLE
,
367 /* [PIPE_FORMAT_Z24_FLOAT_S8_UINT] = D3DFMT_D24FS8, */
369 [PIPE_FORMAT_R16_UINT
] = D3DFMT_INDEX16
,
370 [PIPE_FORMAT_R32_UINT
] = D3DFMT_INDEX32
,
371 [PIPE_FORMAT_R16G16B16A16_SNORM
] = D3DFMT_Q16W16V16U16
,
373 [PIPE_FORMAT_R16_FLOAT
] = D3DFMT_R16F
,
374 [PIPE_FORMAT_R32_FLOAT
] = D3DFMT_R32F
,
375 [PIPE_FORMAT_R16G16_FLOAT
] = D3DFMT_G16R16F
,
376 [PIPE_FORMAT_R32G32_FLOAT
] = D3DFMT_G32R32F
,
377 [PIPE_FORMAT_R16G16B16A16_FLOAT
] = D3DFMT_A16B16G16R16F
,
378 [PIPE_FORMAT_R32G32B32A32_FLOAT
] = D3DFMT_A32B32G32R32F
,
380 /* [PIPE_FORMAT_?] = D3DFMT_CxV8U8, */