1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Luca Barbieri
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDEBUG_GET_ONCE_BOOL_OPTION(dump_shaders, "D3D1X_DUMP_SHADERS", FALSE);
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* These cap sets are much more correct than the ones in u_caps.c */
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* TODO: it seems cube levels should be the same as 2D levels */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DX 9_1 */
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_9_1[] = {
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_RENDER_TARGETS, 1),
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 12),	/* 2048 */
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 8),	 /* 256 */
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_TERMINATE
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DX 9_2 */
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_9_2[] = {
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(OCCLUSION_QUERY),
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(TWO_SIDED_STENCIL),
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(TEXTURE_MIRROR_CLAMP),
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(BLEND_EQUATION_SEPARATE),
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_RENDER_TARGETS, 1),
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 12),	/* 2048 */
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 9),	 /* 256 */
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_TERMINATE
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DX 9_3 */
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_9_3[] = {
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(OCCLUSION_QUERY),
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(TWO_SIDED_STENCIL),
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(TEXTURE_MIRROR_CLAMP),
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(BLEND_EQUATION_SEPARATE),
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(SM3),
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(VERTEX_ELEMENT_INSTANCE_DIVISOR),
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(OCCLUSION_QUERY),
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_RENDER_TARGETS, 4),
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 13),	/* 4096 */
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 9),	 /* 256 */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_TERMINATE
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_10_0[] = {
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(INDEP_BLEND_ENABLE),
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(ANISOTROPIC_FILTER),
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(MIXED_COLORBUFFER_FORMATS),
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(FRAGMENT_COLOR_CLAMP_CONTROL),
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(CONDITIONAL_RENDER),
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(PRIMITIVE_RESTART),
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_CAP(TGSI_INSTANCEID),
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_RENDER_TARGETS, 8),
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 13),
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_TEXTURE_ARRAY_LAYERS, 512),
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_INT(MAX_STREAM_OUTPUT_BUFFERS, 4),
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_SHADER(VERTEX, MAX_INPUTS, 16),
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_SHADER(GEOMETRY, MAX_CONST_BUFFERS, 14),
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_SHADER(GEOMETRY, MAX_TEXTURE_SAMPLERS, 16),
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_SHADER(GEOMETRY, SUBROUTINES, 1),
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_SHADER(FRAGMENT, INTEGERS, 1),
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	UTIL_CHECK_TERMINATE
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this is called "screen" because in the D3D10 case it's only part of the device
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate<bool threadsafe>
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	D3D_FEATURE_LEVEL feature_level;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	int format_support[PIPE_FORMAT_COUNT];
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned creation_flags;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	unsigned exception_mode;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	maybe_mutex_t<threadsafe> mutex;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* TODO: Direct3D 11 specifies that fine-grained locking should be used if the driver supports it.
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Right now, I don't trust Gallium drivers to get this right.
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SYNCHRONIZED lock_t<maybe_mutex_t<threadsafe> > lock_(mutex)
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GalliumD3D11ScreenImpl(struct pipe_screen* screen, struct pipe_context* immediate_pipe, BOOL owns_immediate_pipe,unsigned creation_flags, IDXGIAdapter* adapter)
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	: GalliumD3D11Screen(screen, immediate_pipe, adapter), creation_flags(creation_flags)
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&screen_caps, 0, sizeof(screen_caps));
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		screen_caps.gs = screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		screen_caps.so = screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) > 0;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		screen_caps.queries = screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		screen_caps.render_condition = screen->get_param(screen, PIPE_CAP_CONDITIONAL_RENDER);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < PIPE_SHADER_TYPES; ++i)
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			screen_caps.constant_buffers[i] = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONST_BUFFERS);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		screen_caps.stages = 0;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < PIPE_SHADER_TYPES; ++i)
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(!screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_INSTRUCTIONS))
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			screen_caps.stages = i + 1;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		screen_caps.stages_with_sampling = (1 << screen_caps.stages) - 1;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!screen->get_shader_param(screen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS))
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			screen_caps.stages_with_sampling &=~ (1 << PIPE_SHADER_VERTEX);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(format_support, 0xff, sizeof(format_support));
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		float default_level = 9.1f;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!util_check_caps(screen, caps_dx_9_1))
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			_debug_printf("Warning: driver does not even meet D3D_FEATURE_LEVEL_9_1 features, advertising it anyway!\n");
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(!util_check_caps(screen, caps_dx_9_2))
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default_level = 9.1f;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(!util_check_caps(screen, caps_dx_9_3))
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default_level = 9.2f;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(!util_check_caps(screen, caps_dx_10_0))
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default_level = 9.3f;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default_level = 10.0f;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		char default_level_name[64];
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sprintf(default_level_name, "%.1f", default_level);
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		float feature_level_number = atof(debug_get_option("D3D11_FEATURE_LEVEL", default_level_name));
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!feature_level_number)
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			feature_level_number = default_level;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(feature_level_number >= 11.0f)
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			feature_level = D3D_FEATURE_LEVEL_11_0;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(feature_level_number >= 10.1f)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			feature_level = D3D_FEATURE_LEVEL_10_1;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(feature_level_number >= 10.0f)
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			feature_level = D3D_FEATURE_LEVEL_10_0;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(feature_level_number >= 9.3f)
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			feature_level = D3D_FEATURE_LEVEL_9_3;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(feature_level_number >= 9.2f)
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			feature_level = D3D_FEATURE_LEVEL_9_2;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			feature_level = D3D_FEATURE_LEVEL_9_1;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		immediate_context = GalliumD3D11ImmediateDeviceContext_Create(this, immediate_pipe, owns_immediate_pipe);
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// release to the reference to ourselves that the immediate context took, to avoid a garbage cycle
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		immediate_context->Release();
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	~GalliumD3D11ScreenImpl()
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GalliumD3D11ImmediateDeviceContext_Destroy(immediate_context);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual D3D_FEATURE_LEVEL STDMETHODCALLTYPE GetFeatureLevel(void)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return feature_level;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual unsigned STDMETHODCALLTYPE GetCreationFlags(void)
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return creation_flags;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE GetDeviceRemovedReason(void)
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual void STDMETHODCALLTYPE GetImmediateContext(
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11DeviceContext **out_immediate_context)
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		immediate_context->AddRef();
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_immediate_context = immediate_context;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE SetExceptionMode(unsigned RaiseFlags)
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		exception_mode = RaiseFlags;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual unsigned STDMETHODCALLTYPE GetExceptionMode(void)
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return exception_mode;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CheckCounter(
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_COUNTER_DESC *desc,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_COUNTER_TYPE *type,
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned *active_counters,
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		LPSTR sz_name,
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned *name_length,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		LPSTR sz_units,
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned *units_length,
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		LPSTR sz_description,
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned *description_length)
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return E_NOTIMPL;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual void STDMETHODCALLTYPE CheckCounterInfo(
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_COUNTER_INFO *counter_info)
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* none supported at the moment */
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		counter_info->LastDeviceDependentCounter = (D3D11_COUNTER)0;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		counter_info->NumDetectableParallelUnits = 1;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		counter_info->NumSimultaneousCounters = 0;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CheckFeatureSupport(
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_FEATURE feature,
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void *out_feature_support_data,
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned feature_support_data_size)
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(feature)
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case D3D11_FEATURE_THREADING:
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				D3D11_FEATURE_DATA_THREADING* data = (D3D11_FEATURE_DATA_THREADING*)out_feature_support_data;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(feature_support_data_size != sizeof(*data))
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return E_INVALIDARG;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				data->DriverCommandLists = FALSE;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				data->DriverConcurrentCreates = FALSE;
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return S_OK;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case D3D11_FEATURE_DOUBLES:
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				D3D11_FEATURE_DATA_DOUBLES* data = (D3D11_FEATURE_DATA_DOUBLES*)out_feature_support_data;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(feature_support_data_size != sizeof(*data))
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return E_INVALIDARG;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				data->DoublePrecisionFloatShaderOps = FALSE;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return S_OK;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case D3D11_FEATURE_FORMAT_SUPPORT:
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				D3D11_FEATURE_DATA_FORMAT_SUPPORT* data = (D3D11_FEATURE_DATA_FORMAT_SUPPORT*)out_feature_support_data;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(feature_support_data_size != sizeof(*data))
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return E_INVALIDARG;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return this->CheckFormatSupport(data->InFormat, &data->OutFormatSupport);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case D3D11_FEATURE_FORMAT_SUPPORT2:
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				D3D11_FEATURE_DATA_FORMAT_SUPPORT* data = (D3D11_FEATURE_DATA_FORMAT_SUPPORT*)out_feature_support_data;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(feature_support_data_size != sizeof(*data))
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return E_INVALIDARG;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				data->OutFormatSupport = 0;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				/* TODO: should this be S_OK? */
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS:
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS* data = (D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS*)out_feature_support_data;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(feature_support_data_size != sizeof(*data))
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					return E_INVALIDARG;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				data->ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x = FALSE;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return S_OK;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default:
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CheckFormatSupport(
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_FORMAT dxgi_format,
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned *out_format_support
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TODO: MSAA, advanced features */
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_format format = dxgi_to_pipe_format[dxgi_format];
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!format)
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		int support = format_support[format];
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(support < 0)
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			support = 0;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(dxgi_format == DXGI_FORMAT_R8_UINT ||
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   dxgi_format == DXGI_FORMAT_R16_UINT ||
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   dxgi_format == DXGI_FORMAT_R32_UINT)
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(screen->is_format_supported(screen, format, PIPE_BUFFER, 0, PIPE_BIND_VERTEX_BUFFER))
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        if(screen->is_format_supported(screen, format, PIPE_BUFFER, 0, PIPE_BIND_STREAM_OUTPUT))
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_SO_BUFFER;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        if(screen->is_format_supported(screen, format, PIPE_TEXTURE_1D, 0, PIPE_BIND_SAMPLER_VIEW))
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_TEXTURE1D;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW))
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_TEXTURE2D;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        if(screen->is_format_supported(screen, format, PIPE_TEXTURE_CUBE, 0, PIPE_BIND_SAMPLER_VIEW))
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_TEXTURECUBE;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        if(screen->is_format_supported(screen, format, PIPE_TEXTURE_3D, 0, PIPE_BIND_SAMPLER_VIEW))
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_TEXTURE3D;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(support & (D3D11_FORMAT_SUPPORT_TEXTURE1D | D3D11_FORMAT_SUPPORT_TEXTURE2D |
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      D3D11_FORMAT_SUPPORT_TEXTURE3D | D3D11_FORMAT_SUPPORT_TEXTURECUBE))
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |=
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					D3D11_FORMAT_SUPPORT_SHADER_LOAD |
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					D3D11_FORMAT_SUPPORT_SHADER_SAMPLE |
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					D3D11_FORMAT_SUPPORT_MIP |
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					D3D11_FORMAT_SUPPORT_MIP_AUTOGEN;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(util_format_is_depth_or_stencil(format))
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					support |= D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET | PIPE_BIND_BLENDABLE))
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_BLENDABLE;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET))
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_RENDER_TARGET;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_DEPTH_STENCIL))
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_DEPTH_STENCIL;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_DISPLAY_TARGET))
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_DISPLAY;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned ms;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for(ms = 2; ms <= 8; ++ms)
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, ms, PIPE_BIND_RENDER_TARGET))
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				{
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					support |= D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(ms <= 8 && screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, ms, PIPE_BIND_SAMPLER_VIEW))
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				support |= D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			format_support[format] = support;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_format_support = support;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CheckMultisampleQualityLevels(
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_FORMAT format,
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned sample_count,
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned *pcount
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(sample_count == 1)
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			*pcount = 1;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			*pcount = 0;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	template<typename T, typename U>
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	bool convert_blend_state(T& to, const U& from, unsigned BlendEnable, unsigned RenderTargetWriteMask)
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(unlikely(BlendEnable &&
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    (from.SrcBlend >= D3D11_BLEND_COUNT ||
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     from.SrcBlendAlpha >= D3D11_BLEND_COUNT ||
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     from.DestBlend >= D3D11_BLEND_COUNT ||
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     from.DestBlendAlpha >= D3D11_BLEND_COUNT ||
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     from.BlendOp >= 6 ||
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     from.BlendOp == 0 ||
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     from.BlendOpAlpha >= 6 ||
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     from.BlendOpAlpha == 0)))
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return false;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		to.blend_enable = BlendEnable;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(BlendEnable)
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			to.rgb_func = from.BlendOp - 1;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			to.alpha_func = from.BlendOpAlpha - 1;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			to.rgb_src_factor = d3d11_to_pipe_blend[from.SrcBlend];
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			to.alpha_src_factor = d3d11_to_pipe_blend[from.SrcBlendAlpha];
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			to.rgb_dst_factor = d3d11_to_pipe_blend[from.DestBlend];
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			to.alpha_dst_factor = d3d11_to_pipe_blend[from.DestBlendAlpha];
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		to.colormask = RenderTargetWriteMask & 0xf;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return true;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateBlendState(
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_BLEND_DESC *blend_state_desc,
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11BlendState **out_blend_state
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateBlendState1(
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D10_BLEND_DESC1 *blend_state_desc,
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D10BlendState1 **out_blend_state
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_blend_state state;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&state, 0, sizeof(state));
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.alpha_to_coverage = !!blend_state_desc->AlphaToCoverageEnable;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.independent_blend_enable = !!blend_state_desc->IndependentBlendEnable;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(PIPE_MAX_COLOR_BUFS >= 8);
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const unsigned n = blend_state_desc->IndependentBlendEnable ? 8 : 1;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < n; ++i)
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 if(!convert_blend_state(
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 state.rt[i],
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 blend_state_desc->RenderTarget[i],
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 blend_state_desc->RenderTarget[i].BlendEnable,
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 blend_state_desc->RenderTarget[i].RenderTargetWriteMask))
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 return E_INVALIDARG;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_blend_state)
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void* object = immediate_pipe->create_blend_state(immediate_pipe, &state);
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!object)
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_blend_state = new GalliumD3D11BlendState(this, object, *blend_state_desc);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API < 11
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateBlendState(
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D10_BLEND_DESC *blend_state_desc,
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D10BlendState **out_blend_state
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_blend_state state;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&state, 0, sizeof(state));
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.alpha_to_coverage = !!blend_state_desc->AlphaToCoverageEnable;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(PIPE_MAX_COLOR_BUFS >= 8);
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < 8; ++i)
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(!convert_blend_state(
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				state.rt[i],
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				*blend_state_desc,
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				blend_state_desc->BlendEnable[i],
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				blend_state_desc->RenderTargetWriteMask[i]))
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 1; i < 8; ++i)
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(memcmp(&state.rt[0], &state.rt[i], sizeof(state.rt[0])))
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				state.independent_blend_enable = TRUE;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void* object = immediate_pipe->create_blend_state(immediate_pipe, &state);
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!object)
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_blend_state = new GalliumD3D11BlendState(this, object, *blend_state_desc);
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateDepthStencilState(
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_DEPTH_STENCIL_DESC *depth_stencil_state_desc,
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11DepthStencilState **depth_stencil_state
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_depth_stencil_alpha_state state;
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&state, 0, sizeof(state));
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.depth.enabled = !!depth_stencil_state_desc->DepthEnable;
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(depth_stencil_state_desc->DepthEnable)
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(depth_stencil_state_desc->DepthFunc == 0 ||
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   depth_stencil_state_desc->DepthFunc >= 9)
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.depth.writemask = depth_stencil_state_desc->DepthWriteMask;
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.depth.func = depth_stencil_state_desc->DepthFunc - 1;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.stencil[0].enabled = !!depth_stencil_state_desc->StencilEnable;
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(depth_stencil_state_desc->StencilEnable)
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(depth_stencil_state_desc->FrontFace.StencilPassOp >= D3D11_STENCIL_OP_COUNT ||
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   depth_stencil_state_desc->FrontFace.StencilFailOp >= D3D11_STENCIL_OP_COUNT ||
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   depth_stencil_state_desc->FrontFace.StencilDepthFailOp >= D3D11_STENCIL_OP_COUNT ||
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   depth_stencil_state_desc->BackFace.StencilPassOp >= D3D11_STENCIL_OP_COUNT ||
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   depth_stencil_state_desc->BackFace.StencilFailOp >= D3D11_STENCIL_OP_COUNT ||
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   depth_stencil_state_desc->BackFace.StencilDepthFailOp >= D3D11_STENCIL_OP_COUNT)
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[0].writemask = depth_stencil_state_desc->StencilWriteMask;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[0].valuemask = depth_stencil_state_desc->StencilReadMask;
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[0].zpass_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->FrontFace.StencilPassOp];
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[0].fail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->FrontFace.StencilFailOp];
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[0].zfail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->FrontFace.StencilDepthFailOp];
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[0].func = depth_stencil_state_desc->FrontFace.StencilFunc - 1;
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[1].enabled = !!depth_stencil_state_desc->StencilEnable;
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[1].writemask = depth_stencil_state_desc->StencilWriteMask;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[1].valuemask = depth_stencil_state_desc->StencilReadMask;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[1].zpass_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->BackFace.StencilPassOp];
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[1].fail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->BackFace.StencilFailOp];
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[1].zfail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->BackFace.StencilDepthFailOp];
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.stencil[1].func = depth_stencil_state_desc->BackFace.StencilFunc - 1;
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!depth_stencil_state)
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void* object = immediate_pipe->create_depth_stencil_alpha_state(immediate_pipe, &state);
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!object)
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*depth_stencil_state = new GalliumD3D11DepthStencilState(this, object, *depth_stencil_state_desc);
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateRasterizerState(
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_RASTERIZER_DESC *rasterizer_desc,
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11RasterizerState **out_rasterizer_state)
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_rasterizer_state state;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&state, 0, sizeof(state));
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.gl_rasterization_rules = 1; /* D3D10/11 use GL rules */
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.fill_front = state.fill_back = (rasterizer_desc->FillMode == D3D11_FILL_WIREFRAME) ? PIPE_POLYGON_MODE_LINE : PIPE_POLYGON_MODE_FILL;
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(rasterizer_desc->CullMode == D3D11_CULL_FRONT)
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.cull_face = PIPE_FACE_FRONT;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(rasterizer_desc->CullMode == D3D11_CULL_BACK)
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.cull_face = PIPE_FACE_BACK;
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.cull_face = PIPE_FACE_NONE;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.front_ccw = !!rasterizer_desc->FrontCounterClockwise;
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.offset_tri = state.offset_line = state.offset_point = rasterizer_desc->SlopeScaledDepthBias || rasterizer_desc->DepthBias;
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.offset_scale = rasterizer_desc->SlopeScaledDepthBias;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.offset_units = rasterizer_desc->DepthBias;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.offset_clamp = rasterizer_desc->DepthBiasClamp;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.depth_clip = rasterizer_desc->DepthClipEnable;
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.scissor = !!rasterizer_desc->ScissorEnable;
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.multisample = !!rasterizer_desc->MultisampleEnable;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.line_smooth = !!rasterizer_desc->AntialiasedLineEnable;
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.flatshade_first = 1;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.line_width = 1.0f;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.point_size = 1.0f;
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TODO: is this correct? */
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.point_quad_rasterization = 1;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_rasterizer_state)
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void* object = immediate_pipe->create_rasterizer_state(immediate_pipe, &state);
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!object)
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_rasterizer_state = new GalliumD3D11RasterizerState(this, object, *rasterizer_desc);
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateSamplerState(
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SAMPLER_DESC *sampler_desc,
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11SamplerState **out_sampler_state)
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_sampler_state state;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&state, 0, sizeof(state));
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.normalized_coords = 1;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.min_mip_filter = (sampler_desc->Filter & 1);
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.mag_img_filter = ((sampler_desc->Filter >> 2) & 1);
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.min_img_filter = ((sampler_desc->Filter >> 4) & 1);
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(sampler_desc->Filter & 0x40)
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.max_anisotropy = sampler_desc->MaxAnisotropy;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(sampler_desc->Filter & 0x80)
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE;
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			state.compare_func = sampler_desc->ComparisonFunc - 1;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.wrap_s = d3d11_to_pipe_wrap[sampler_desc->AddressU];
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.wrap_t = d3d11_to_pipe_wrap[sampler_desc->AddressV];
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.wrap_r = d3d11_to_pipe_wrap[sampler_desc->AddressW];
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.lod_bias = sampler_desc->MipLODBias;
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memcpy(state.border_color.f, sampler_desc->BorderColor, sizeof(state.border_color));
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.min_lod = sampler_desc->MinLOD;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		state.max_lod = sampler_desc->MaxLOD;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_sampler_state)
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void* object = immediate_pipe->create_sampler_state(immediate_pipe, &state);
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!object)
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_sampler_state = new GalliumD3D11SamplerState(this, object, *sampler_desc);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateInputLayout(
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_INPUT_ELEMENT_DESC *input_element_descs,
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned count,
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const void *shader_bytecode_with_input_signature,
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SIZE_T bytecode_length,
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11InputLayout **out_input_layout)
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(count > D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT)
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT <= PIPE_MAX_ATTRIBS);
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// putting semantics matching in the core API seems to be a (minor) design mistake
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode_with_input_signature, bytecode_length, DXBC_FIND_INPUT_SIGNATURE);
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_SIGNATURE_PARAMETER_DESC* params;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned num_params = dxbc_parse_signature(sig, &params);
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		typedef std::unordered_map<std::pair<c_string, unsigned>, unsigned> semantic_to_idx_map_t;
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		semantic_to_idx_map_t semantic_to_idx_map;
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < count; ++i)
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			semantic_to_idx_map[std::make_pair(c_string(input_element_descs[i].SemanticName), input_element_descs[i].SemanticIndex)] = i;
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_vertex_element elements[D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT];
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		enum pipe_format formats[D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT];
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned offsets[D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT];
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		offsets[0] = 0;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < count; ++i)
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			formats[i] = dxgi_to_pipe_format[input_element_descs[i].Format];
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(likely(input_element_descs[i].AlignedByteOffset != D3D11_APPEND_ALIGNED_ELEMENT))
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				offsets[i] = input_element_descs[i].AlignedByteOffset;
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else if(i > 0)
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned align_mask = util_format_description(formats[i])->channel[0].size;
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(align_mask & 7) // e.g. R10G10B10A2
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					align_mask = 32;
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				align_mask = (align_mask / 8) - 1;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				offsets[i] = (offsets[i - 1] + util_format_get_blocksize(formats[i - 1]) + align_mask) & ~align_mask;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// TODO: check for & report errors (e.g. ambiguous layouts, unmatched semantics)
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned num_params_to_use = 0;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < num_params && num_params_to_use < D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT; ++i)
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(!strcasecmp(params[i].SemanticName, "SV_INSTANCEID") ||
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   !strcasecmp(params[i].SemanticName, "SV_VERTEXID"))
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				continue;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			const unsigned n = num_params_to_use++;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			semantic_to_idx_map_t::iterator iter = semantic_to_idx_map.find(std::make_pair(c_string(params[i].SemanticName), params[i].SemanticIndex));
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(iter != semantic_to_idx_map.end())
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				unsigned idx = iter->second;
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].src_format = formats[idx];
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].src_offset = offsets[idx];
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].vertex_buffer_index = input_element_descs[idx].InputSlot;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].instance_divisor = input_element_descs[idx].InstanceDataStepRate;
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if (input_element_descs[idx].InputSlotClass == D3D11_INPUT_PER_INSTANCE_DATA)
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					if (elements[n].instance_divisor == 0)
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						elements[n].instance_divisor = ~0; // XXX: can't specify 'never' to gallium
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				// XXX: undefined input, is this valid or should we return an error ?
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].src_format = PIPE_FORMAT_NONE;
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].src_offset = 0;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].vertex_buffer_index = 0;
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				elements[n].instance_divisor = 0;
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		free(params);
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_input_layout)
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void* object = immediate_pipe->create_vertex_elements_state(immediate_pipe, num_params_to_use, elements);
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!object)
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_input_layout = new GalliumD3D11InputLayout(this, object);
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static unsigned d3d11_to_pipe_bind_flags(unsigned bind_flags)
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned bind = 0;
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_VERTEX_BUFFER)
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bind |= PIPE_BIND_VERTEX_BUFFER;
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_INDEX_BUFFER)
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bind |= PIPE_BIND_INDEX_BUFFER;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_CONSTANT_BUFFER)
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bind |= PIPE_BIND_CONSTANT_BUFFER;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_SHADER_RESOURCE)
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bind |= PIPE_BIND_SAMPLER_VIEW;
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_STREAM_OUTPUT)
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bind |= PIPE_BIND_STREAM_OUTPUT;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_RENDER_TARGET)
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bind |= PIPE_BIND_RENDER_TARGET;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_DEPTH_STENCIL)
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			bind |= PIPE_BIND_DEPTH_STENCIL;
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return bind;
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	inline HRESULT create_resource(
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		pipe_texture_target target,
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned width,
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned height,
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned depth,
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned mip_levels,
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned array_size,
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_FORMAT format,
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const DXGI_SAMPLE_DESC* SampleDesc,
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_USAGE usage,
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned bind_flags,
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned c_p_u_access_flags,
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned misc_flags,
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SUBRESOURCE_DATA *initial_data,
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_USAGE dxgi_usage,
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource** ppresource
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(invalid(format >= DXGI_FORMAT_COUNT))
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(misc_flags & D3D11_RESOURCE_MISC_TEXTURECUBE)
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(target != PIPE_TEXTURE_2D)
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			target = PIPE_TEXTURE_CUBE;
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(array_size % 6)
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else if(array_size > 1)
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch (target) {
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_1D: target = PIPE_TEXTURE_1D_ARRAY; break;
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_2D: target = PIPE_TEXTURE_2D_ARRAY; break;
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default:
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TODO: msaa */
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource templat;
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&templat, 0, sizeof(templat));
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.target = target;
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.width0 = width;
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.height0 = height;
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.depth0 = depth;
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.array_size = array_size;
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(mip_levels)
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.last_level = mip_levels - 1;
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.last_level = MAX2(MAX2(util_logbase2(templat.width0), util_logbase2(templat.height0)), util_logbase2(templat.depth0));
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.format = dxgi_to_pipe_format[format];
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind_flags & D3D11_BIND_DEPTH_STENCIL) {
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			// colour formats are not depth-renderable, but depth/stencil-formats may be colour-renderable
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch(format)
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case DXGI_FORMAT_R32_TYPELESS: templat.format = PIPE_FORMAT_Z32_FLOAT; break;
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case DXGI_FORMAT_R16_TYPELESS: templat.format = PIPE_FORMAT_Z16_UNORM; break;
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default:
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.bind = d3d11_to_pipe_bind_flags(bind_flags);
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(c_p_u_access_flags & D3D11_CPU_ACCESS_READ)
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.bind |= PIPE_BIND_TRANSFER_READ;
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(c_p_u_access_flags & D3D11_CPU_ACCESS_WRITE)
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.bind |= PIPE_BIND_TRANSFER_WRITE;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(misc_flags & D3D11_RESOURCE_MISC_SHARED)
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.bind |= PIPE_BIND_SHARED;
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(misc_flags & D3D11_RESOURCE_MISC_GDI_COMPATIBLE)
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.bind |= PIPE_BIND_TRANSFER_READ | PIPE_BIND_TRANSFER_WRITE;
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(dxgi_usage & DXGI_USAGE_BACK_BUFFER)
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.bind |= PIPE_BIND_DISPLAY_TARGET;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.usage = d3d11_to_pipe_usage[usage];
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(invalid(!templat.format))
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!ppresource)
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource* resource = screen->resource_create(screen, &templat);
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!resource)
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(initial_data)
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for(unsigned slice = 0; slice < array_size; ++slice)
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				for(unsigned level = 0; level <= templat.last_level; ++level)
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				{
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					struct pipe_box box;
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					box.x = box.y = 0;
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					box.z = slice;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					box.width = u_minify(width, level);
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					box.height = u_minify(height, level);
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					box.depth = u_minify(depth, level);
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					immediate_pipe->transfer_inline_write(immediate_pipe, resource, level, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | PIPE_TRANSFER_UNSYNCHRONIZED, &box, initial_data->pSysMem, initial_data->SysMemPitch, initial_data->SysMemSlicePitch);
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					++initial_data;
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*ppresource = resource;
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	static unsigned d3d_to_dxgi_usage(unsigned bind, unsigned misc)
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned dxgi_usage = 0;
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind |= D3D11_BIND_RENDER_TARGET)
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			dxgi_usage |= DXGI_USAGE_RENDER_TARGET_OUTPUT;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind & D3D11_BIND_SHADER_RESOURCE)
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			dxgi_usage |= DXGI_USAGE_SHADER_INPUT;
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(bind & D3D11_BIND_UNORDERED_ACCESS)
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			dxgi_usage |= DXGI_USAGE_UNORDERED_ACCESS;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(misc & D3D11_RESOURCE_MISC_SHARED)
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			dxgi_usage |= DXGI_USAGE_SHARED;
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return dxgi_usage;
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateTexture1D(
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_TEXTURE1D_DESC *desc,
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SUBRESOURCE_DATA *initial_data,
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Texture1D **out_texture1d)
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource* resource;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags);
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		HRESULT hr = create_resource(PIPE_TEXTURE_1D, desc->Width, 1, 1, desc->MipLevels, desc->ArraySize, desc->Format, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture1d ? &resource : 0);
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(hr != S_OK)
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return hr;
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_TEXTURE1D_DESC cdesc = *desc;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cdesc.MipLevels = resource->last_level + 1;
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_texture1d = new GalliumD3D11Texture1D(this, resource, cdesc, dxgi_usage);
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateTexture2D(
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_TEXTURE2D_DESC *desc,
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SUBRESOURCE_DATA *initial_data,
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Texture2D **out_texture2d)
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource* resource;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags);
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		HRESULT hr = create_resource(PIPE_TEXTURE_2D, desc->Width, desc->Height, 1, desc->MipLevels, desc->ArraySize, desc->Format, &desc->SampleDesc, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture2d ? &resource : 0);
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(hr != S_OK)
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return hr;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_TEXTURE2D_DESC cdesc = *desc;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cdesc.MipLevels = resource->last_level + 1;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(cdesc.MipLevels == 1 && cdesc.ArraySize == 1)
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			*out_texture2d = new GalliumD3D11Surface(this, resource, cdesc, dxgi_usage);
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			*out_texture2d = new GalliumD3D11Texture2D(this, resource, cdesc, dxgi_usage);
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateTexture3D(
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_TEXTURE3D_DESC *desc,
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SUBRESOURCE_DATA *initial_data,
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Texture3D **out_texture3d)
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource* resource;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags);
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		HRESULT hr = create_resource(PIPE_TEXTURE_3D, desc->Width, desc->Height, desc->Depth, desc->MipLevels, 1, desc->Format, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture3d ? &resource : 0);
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(hr != S_OK)
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return hr;
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_TEXTURE3D_DESC cdesc = *desc;
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		cdesc.MipLevels = resource->last_level + 1;
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_texture3d = new GalliumD3D11Texture3D(this, resource, cdesc, dxgi_usage);
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateBuffer(
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_BUFFER_DESC *desc,
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SUBRESOURCE_DATA *initial_data,
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Buffer **out_buffer)
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource* resource;
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags);
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		HRESULT hr = create_resource(PIPE_BUFFER, desc->ByteWidth, 1, 1, 1, 1, DXGI_FORMAT_R8_UNORM, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_buffer ? &resource : 0);
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(hr != S_OK)
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return hr;
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_buffer = new GalliumD3D11Buffer(this, resource, *desc, dxgi_usage);
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE OpenGalliumResource(
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource* resource,
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		IUnknown** dxgi_resource)
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		/* TODO: maybe support others */
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		assert(resource->target == PIPE_TEXTURE_2D);
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*dxgi_resource = 0;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_TEXTURE2D_DESC desc;
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&desc, 0, sizeof(desc));
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.Width = resource->width0;
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.Height = resource->height0;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		init_pipe_to_dxgi_format();
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.Format = pipe_to_dxgi_format[resource->format];
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.SampleDesc.Count = resource->nr_samples;
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.SampleDesc.Quality = 0;
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.ArraySize = 1;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.MipLevels = resource->last_level + 1;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(resource->bind & PIPE_BIND_RENDER_TARGET)
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.BindFlags |= D3D11_BIND_RENDER_TARGET;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(resource->bind & PIPE_BIND_DEPTH_STENCIL)
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.BindFlags |= D3D11_BIND_DEPTH_STENCIL;
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(resource->bind & PIPE_BIND_SAMPLER_VIEW)
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(resource->bind & PIPE_BIND_SHARED)
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc.BindFlags, desc.MiscFlags);
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(desc.MipLevels == 1 && desc.ArraySize == 1)
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			*dxgi_resource = (ID3D11Texture2D*)new GalliumD3D11Surface(this, resource, desc, dxgi_usage);
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			*dxgi_resource = (ID3D11Texture2D*)new GalliumD3D11Texture2D(this, resource, desc, dxgi_usage);
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateSurface(
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const DXGI_SURFACE_DESC *dxgi_desc,
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned count,
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		DXGI_USAGE usage,
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const DXGI_SHARED_RESOURCE *shared_resource,
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		IDXGISurface **out_surface)
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_TEXTURE2D_DESC desc;
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&desc, 0, sizeof(desc));
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resource* resource;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.Width = dxgi_desc->Width;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.Height = dxgi_desc->Height;
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.Format = dxgi_desc->Format;
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.SampleDesc = dxgi_desc->SampleDesc;
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.ArraySize = count;
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.MipLevels = 1;
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(usage & DXGI_USAGE_RENDER_TARGET_OUTPUT)
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.BindFlags |= D3D11_BIND_RENDER_TARGET;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(usage & DXGI_USAGE_SHADER_INPUT)
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.BindFlags |= D3D11_BIND_SHADER_RESOURCE;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(usage & DXGI_USAGE_UNORDERED_ACCESS)
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS;
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(usage & DXGI_USAGE_SHARED)
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED;
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		HRESULT hr = create_resource(PIPE_TEXTURE_2D, dxgi_desc->Width, dxgi_desc->Height, 1, 1, count, dxgi_desc->Format, &dxgi_desc->SampleDesc, D3D11_USAGE_DEFAULT, desc.BindFlags, D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE, desc.MiscFlags, 0, usage, &resource);
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(hr != S_OK)
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return hr;
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_surface = new GalliumD3D11Surface(this, resource, desc, usage);
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateShaderResourceView(
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Resource *iresource,
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SHADER_RESOURCE_VIEW_DESC *desc,
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11ShaderResourceView **out_srv)
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_SHADER_RESOURCE_VIEW_DESC def_desc;
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(desc->ViewDimension == D3D10_1_SRV_DIMENSION_TEXTURECUBEARRAY)
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D10_SHADER_RESOURCE_VIEW_DESC1 desc1;
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&desc1, 0, sizeof(desc1));
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memcpy(&desc1, desc, sizeof(*desc));
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return CreateShaderResourceView1(iresource, &desc1, (ID3D10ShaderResourceView1**)out_srv);
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateShaderResourceView1(
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ID3D11Resource *iresource,
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			const D3D10_SHADER_RESOURCE_VIEW_DESC1 *desc,
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			ID3D10ShaderResourceView1 **out_srv)
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D10_SHADER_RESOURCE_VIEW_DESC1 def_desc;
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const struct pipe_resource* resource = ((GalliumD3D11Resource<>*)iresource)->resource;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!desc)
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			init_pipe_to_dxgi_format();
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&def_desc, 0, sizeof(def_desc));
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			def_desc.Format = pipe_to_dxgi_format[resource->format];
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch(resource->target)
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_BUFFER:
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Buffer.ElementWidth = resource->width0;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_1D:
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D;
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture1D.MipLevels = resource->last_level + 1;
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_1D_ARRAY:
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY;
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture1DArray.MipLevels = resource->last_level + 1;
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture1DArray.ArraySize = resource->array_size;
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_2D:
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_RECT:
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture2D.MipLevels = resource->last_level + 1;
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_2D_ARRAY:
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture2DArray.MipLevels = resource->last_level + 1;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture2DArray.ArraySize = resource->array_size;
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_3D:
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture3D.MipLevels = resource->last_level + 1;
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_CUBE:
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(resource->array_size > 6)
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				{
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY;
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					def_desc.TextureCubeArray.NumCubes = resource->array_size / 6;
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				else
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				{
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				}
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.TextureCube.MipLevels = resource->last_level + 1;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default:
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc = &def_desc;
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_sampler_view templat;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&templat, 0, sizeof(templat));
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(invalid(format >= DXGI_FORMAT_COUNT))
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.format = (desc->Format == DXGI_FORMAT_UNKNOWN) ? resource->format : dxgi_to_pipe_format[desc->Format];
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!templat.format)
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.swizzle_r = PIPE_SWIZZLE_RED;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.swizzle_g = PIPE_SWIZZLE_GREEN;
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.swizzle_b = PIPE_SWIZZLE_BLUE;
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.swizzle_a = PIPE_SWIZZLE_ALPHA;
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.texture = ((GalliumD3D11Resource<>*)iresource)->resource;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(desc->ViewDimension)
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY:
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice;
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1;
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if (desc->ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBEARRAY) {
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				templat.u.tex.first_layer *= 6;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				templat.u.tex.last_layer *= 6;
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			// fall through
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURE1D:
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURE2D:
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURE3D:
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURECUBE:
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			// yes, this works for all of these types
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.first_level = desc->Texture1D.MostDetailedMip;
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(desc->Texture1D.MipLevels == (unsigned)-1)
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				templat.u.tex.last_level = templat.texture->last_level;
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			else
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				templat.u.tex.last_level = templat.u.tex.first_level + desc->Texture1D.MipLevels - 1;
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			assert(templat.u.tex.last_level >= templat.u.tex.first_level);
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_BUFFER:
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.buf.first_element = desc->Buffer.ElementOffset;
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.buf.last_element = desc->Buffer.ElementOffset + desc->Buffer.ElementWidth - 1;
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURE2DMS:
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY:
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_srv)
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_sampler_view* view = immediate_pipe->create_sampler_view(immediate_pipe, templat.texture, &templat);
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!view)
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_srv = new GalliumD3D11ShaderResourceView(this, (GalliumD3D11Resource<>*)iresource, view, *desc);
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateUnorderedAccessView(
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Resource *resource,
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_UNORDERED_ACCESS_VIEW_DESC *desc,
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11UnorderedAccessView **out_uav)
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return E_NOTIMPL;
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// remember to return S_FALSE and not crash if out_u_a_view == 0 and parameters are valid
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateRenderTargetView(
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Resource *iresource,
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_RENDER_TARGET_VIEW_DESC *desc,
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11RenderTargetView **out_rtv)
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const struct pipe_resource* resource = ((GalliumD3D11Resource<>*)iresource)->resource;
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_RENDER_TARGET_VIEW_DESC def_desc;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!desc)
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			init_pipe_to_dxgi_format();
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&def_desc, 0, sizeof(def_desc));
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			def_desc.Format = pipe_to_dxgi_format[resource->format];
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch(resource->target)
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_BUFFER:
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_RTV_DIMENSION_BUFFER;
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Buffer.ElementWidth = resource->width0;
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_1D:
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1D;
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_1D_ARRAY:
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1DARRAY;
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture1DArray.ArraySize = resource->array_size;
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_2D:
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_RECT:
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_2D_ARRAY:
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture2DArray.ArraySize = resource->array_size;
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_3D:
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture3D.WSize = resource->depth0;
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_CUBE:
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture2DArray.ArraySize = 6;
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default:
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc = &def_desc;
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_surface templat;
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&templat, 0, sizeof(templat));
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(invalid(desc->format >= DXGI_FORMAT_COUNT))
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.format = (desc->Format == DXGI_FORMAT_UNKNOWN) ? resource->format : dxgi_to_pipe_format[desc->Format];
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!templat.format)
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.usage = PIPE_BIND_RENDER_TARGET;
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.texture = ((GalliumD3D11Resource<>*)iresource)->resource;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(desc->ViewDimension)
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_TEXTURE1D:
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_TEXTURE2D:
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.level = desc->Texture1D.MipSlice;
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_TEXTURE3D:
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.level = desc->Texture3D.MipSlice;
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.first_layer = desc->Texture3D.FirstWSlice;
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.last_layer = desc->Texture3D.FirstWSlice + desc->Texture3D.WSize - 1;
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.level = desc->Texture1DArray.MipSlice;
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice;
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1;
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_BUFFER:
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.buf.first_element = desc->Buffer.ElementOffset;
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.buf.last_element = desc->Buffer.ElementOffset + desc->Buffer.ElementWidth - 1;
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_TEXTURE2DMS:
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY:
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_rtv)
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_surface* surface = immediate_pipe->create_surface(immediate_pipe, templat.texture, &templat);
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!surface)
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_rtv = new GalliumD3D11RenderTargetView(this, (GalliumD3D11Resource<>*)iresource, surface, *desc);
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateDepthStencilView(
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Resource *iresource,
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_DEPTH_STENCIL_VIEW_DESC *desc,
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11DepthStencilView **out_depth_stencil_view)
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const struct pipe_resource* resource = ((GalliumD3D11Resource<>*)iresource)->resource;
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_DEPTH_STENCIL_VIEW_DESC def_desc;
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!desc)
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			init_pipe_to_dxgi_format();
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memset(&def_desc, 0, sizeof(def_desc));
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			def_desc.Format = pipe_to_dxgi_format[resource->format];
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			switch(resource->target)
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			{
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_1D:
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE1D;
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_1D_ARRAY:
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE1DARRAY;
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture1DArray.ArraySize = resource->array_size;
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_2D:
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_RECT:
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_2D_ARRAY:
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture2DArray.ArraySize = resource->array_size;
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			case PIPE_TEXTURE_CUBE:
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				def_desc.Texture2DArray.ArraySize = 6;
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				break;
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			default:
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				return E_INVALIDARG;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			}
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			desc = &def_desc;
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_surface templat;
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&templat, 0, sizeof(templat));
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(invalid(desc->format >= DXGI_FORMAT_COUNT))
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.format = (desc->Format == DXGI_FORMAT_UNKNOWN) ? resource->format : dxgi_to_pipe_format[desc->Format];
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!templat.format)
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.usage = PIPE_BIND_DEPTH_STENCIL;
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		templat.texture = ((GalliumD3D11Resource<>*)iresource)->resource;
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(desc->ViewDimension)
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_DSV_DIMENSION_TEXTURE1D:
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_DSV_DIMENSION_TEXTURE2D:
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.level = desc->Texture1D.MipSlice;
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_DSV_DIMENSION_TEXTURE1DARRAY:
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.level = desc->Texture1DArray.MipSlice;
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice;
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1;
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_DSV_DIMENSION_TEXTURE2DMS:
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_depth_stencil_view)
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_surface* surface = immediate_pipe->create_surface(immediate_pipe, templat.texture, &templat);
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!surface)
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_depth_stencil_view = new GalliumD3D11DepthStencilView(this, (GalliumD3D11Resource<>*)iresource, surface, *desc);
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define D3D1X_SHVER_GEOMETRY_SHADER 2 /* D3D11_SHVER_GEOMETRY_SHADER */
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	GalliumD3D11Shader<>* create_stage_shader(unsigned type, const void* shader_bytecode, SIZE_T bytecode_length
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			, ID3D11ClassLinkage *class_linkage
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			, struct pipe_stream_output_info* so_info)
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		bool dump = debug_get_option_dump_shaders();
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		std::auto_ptr<sm4_program> sm4(0);
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		dxbc_chunk_header* sm4_chunk = dxbc_find_shader_bytecode(shader_bytecode, bytecode_length);
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!sm4_chunk)
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(so_info)
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				sm4.reset(new sm4_program());
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sm4.reset(sm4_parse(sm4_chunk + 1, bswap_le32(sm4_chunk->size)));
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			// check if this is a dummy GS, in which case we only need a place to store the signature
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(sm4.get() && so_info && sm4->version.type != D3D1X_SHVER_GEOMETRY_SHADER)
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				sm4.reset(new sm4_program());
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!sm4.get())
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 0;
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(dump)
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sm4->dump();
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct dxbc_chunk_signature* sig;
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_INPUT_SIGNATURE);
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(sig)
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sm4->num_params_in = dxbc_parse_signature(sig, &sm4->params_in);
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE);
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(sig)
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sm4->num_params_out = dxbc_parse_signature(sig, &sm4->params_out);
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_PATCH_SIGNATURE);
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(sig)
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			sm4->num_params_patch = dxbc_parse_signature(sig, &sm4->params_patch);
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_shader_state tgsi_shader;
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&tgsi_shader, 0, sizeof(tgsi_shader));
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(so_info)
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			memcpy(&tgsi_shader.stream_output, so_info, sizeof(tgsi_shader.stream_output));
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(so_info && sm4->version.type != D3D1X_SHVER_GEOMETRY_SHADER)
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_shader.tokens = (const tgsi_token*)sm4_to_tgsi_linkage_only(*sm4);
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_shader.tokens = (const tgsi_token*)sm4_to_tgsi(*sm4);
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!tgsi_shader.tokens)
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return 0;
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(dump)
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			tgsi_dump(tgsi_shader.tokens, 0);
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		void* shader_cso;
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GalliumD3D11Shader<>* shader;
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(type)
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_SHADER_VERTEX:
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader_cso = immediate_pipe->create_vs_state(immediate_pipe, &tgsi_shader);
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader = (GalliumD3D11Shader<>*)new GalliumD3D11VertexShader(this, shader_cso);
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_SHADER_FRAGMENT:
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader_cso = immediate_pipe->create_fs_state(immediate_pipe, &tgsi_shader);
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader = (GalliumD3D11Shader<>*)new GalliumD3D11PixelShader(this, shader_cso);
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case PIPE_SHADER_GEOMETRY:
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader_cso = immediate_pipe->create_gs_state(immediate_pipe, &tgsi_shader);
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader = (GalliumD3D11Shader<>*)new GalliumD3D11GeometryShader(this, shader_cso);
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader_cso = 0;
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader = 0;
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		free((void*)tgsi_shader.tokens);
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return shader;
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CREATE_SHADER_ARGS \
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const void *shader_bytecode, \
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SIZE_T bytecode_length, \
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	ID3D11ClassLinkage *class_linkage
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PASS_SHADER_ARGS shader_bytecode, bytecode_length, class_linkage
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CREATE_SHADER_ARGS \
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	const void *shader_bytecode, \
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	SIZE_T bytecode_length
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PASS_SHADER_ARGS shader_bytecode, bytecode_length
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMPLEMENT_CREATE_SHADER(Stage, GALLIUM) \
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE Create##Stage##Shader( \
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		CREATE_SHADER_ARGS, \
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11##Stage##Shader **out_shader) \
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{ \
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED; \
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GalliumD3D11##Stage##Shader* shader = (GalliumD3D11##Stage##Shader*)create_stage_shader(PIPE_SHADER_##GALLIUM, PASS_SHADER_ARGS, NULL); \
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!shader) \
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL; \
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(out_shader) \
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{ \
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			*out_shader = shader; \
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_OK; \
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} \
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		else \
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{ \
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			shader->Release(); \
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE; \
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		} \
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMPLEMENT_NOTIMPL_CREATE_SHADER(Stage) \
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE Create##Stage##Shader( \
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		CREATE_SHADER_ARGS, \
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11##Stage##Shader **out_shader) \
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{ \
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return E_NOTIMPL; \
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	IMPLEMENT_CREATE_SHADER(Vertex, VERTEX)
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	IMPLEMENT_CREATE_SHADER(Pixel, FRAGMENT)
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	IMPLEMENT_CREATE_SHADER(Geometry, GEOMETRY)
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	IMPLEMENT_NOTIMPL_CREATE_SHADER(Hull)
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	IMPLEMENT_NOTIMPL_CREATE_SHADER(Domain)
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	IMPLEMENT_NOTIMPL_CREATE_SHADER(Compute)
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateGeometryShaderWithStreamOutput(
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const void *shader_bytecode,
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SIZE_T bytecode_length,
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_SO_DECLARATION_ENTRY *so_declaration,
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned num_entries,
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const unsigned *buffer_strides,
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned num_strides,
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned rasterized_stream,
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11ClassLinkage *class_linkage,
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		UINT output_stream_stride,
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11GeometryShader **out_geometry_shader)
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GalliumD3D11GeometryShader* gs;
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(rasterized_stream != 0)
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL; // not yet supported by gallium
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE);
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!sig)
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		D3D11_SIGNATURE_PARAMETER_DESC* out;
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned num_outputs = dxbc_parse_signature(sig, &out);
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_stream_output_info so;
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		memset(&so, 0, sizeof(so));
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(num_strides)
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			so.stride = buffer_strides[0];
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(num_strides > 1)
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			debug_printf("Warning: multiple user-specified strides not implemented !\n");
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		so.stride = output_stream_stride;
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		for(unsigned i = 0; i < num_entries; ++i)
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			unsigned j;
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			for(j = 0; j < num_outputs; ++j)
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				if(out[j].SemanticIndex == so_declaration[i].SemanticIndex && !strcasecmp(out[j].SemanticName, so_declaration[i].SemanticName))
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					break;
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			if(j >= num_outputs)
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				continue;
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			const int first_comp = ffs(out[j].Mask) - 1 + so_declaration[i].StartComponent;
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			so.output[i].output_buffer = so_declaration[i].OutputSlot;
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			so.output[i].register_index = out[j].Register;
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			so.output[i].register_mask = ((1 << so_declaration[i].ComponentCount) - 1) << first_comp;
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			++so.num_outputs;
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(out)
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			free(out);
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		gs = reinterpret_cast<GalliumD3D11GeometryShader*>(create_stage_shader(PIPE_SHADER_GEOMETRY, PASS_SHADER_ARGS, &so));
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!gs)
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_geometry_shader) {
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			gs->Release();
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_geometry_shader = gs;
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateClassLinkage(
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11ClassLinkage **out_linkage)
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return E_NOTIMPL;
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateQuery(
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_QUERY_DESC *query_desc,
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Query **out_query)
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(invalid(query_desc->Query >= D3D11_QUERY_COUNT))
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned query_type = d3d11_to_pipe_query[query_desc->Query];
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(query_type >= PIPE_QUERY_TYPES)
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_NOTIMPL;
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!out_query)
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_query* query = immediate_pipe->create_query(immediate_pipe, query_type);
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!query)
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_query = new GalliumD3D11Query(this, query, d3d11_query_size[query_desc->Query], *query_desc);
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreatePredicate(
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_QUERY_DESC *predicate_desc,
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Predicate **out_predicate)
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned query_type;
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		switch(predicate_desc->Query)
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		{
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_QUERY_SO_OVERFLOW_PREDICATE:
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			query_type = PIPE_QUERY_SO_OVERFLOW_PREDICATE;
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		case D3D11_QUERY_OCCLUSION_PREDICATE:
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			query_type = PIPE_QUERY_OCCLUSION_PREDICATE;
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			break;
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		default:
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_INVALIDARG;
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		}
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(out_predicate)
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return S_FALSE;
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_query* query = immediate_pipe->create_query(immediate_pipe, query_type);
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		if(!query)
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			return E_FAIL;
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		*out_predicate = new GalliumD3D11Predicate(this, query, sizeof(BOOL), *predicate_desc);
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return S_OK;
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateCounter(
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		const D3D11_COUNTER_DESC *counter_desc,
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11Counter **out_counter)
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return E_NOTIMPL;
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// remember to return S_FALSE if out_counter == NULL and everything is OK
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE CreateDeferredContext(
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		unsigned context_flags,
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		ID3D11DeviceContext **out_deferred_context)
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// TODO: this will have to be implemented using a new Gallium util module
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return E_NOTIMPL;
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// remember to return S_FALSE if out_counter == NULL and everything is OK
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual HRESULT STDMETHODCALLTYPE OpenSharedResource(
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			HANDLE resource,
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			REFIID iid,
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			void **out_resource)
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		SYNCHRONIZED;
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// TODO: the problem here is that we need to communicate dimensions somehow
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return E_NOTIMPL;
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		// remember to return S_FALSE if out_counter == NULL and everything is OK
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct pipe_resou	rce templat;
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		struct winsys_handle handle;
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		handle.stride = 0;
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		handle.handle = resource;
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		handle.type = DRM_API_HANDLE_TYPE_SHARED;
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		screen->resource_from_handle(screen, &templat, &handle);
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API < 11
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	/* these are documented as "Not implemented".
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * According to the UMDDI documentation, they apparently turn on a
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * (width + 1) x (height + 1) convolution filter for 1-bit textures.
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 * Probably nothing uses these, assuming it has ever been implemented anywhere.
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 */
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	void STDMETHODCALLTYPE SetTextFilterSize(
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		UINT width,
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		UINT height
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{}
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual void STDMETHODCALLTYPE GetTextFilterSize(
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		UINT *width,
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		UINT *height
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	)
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{}
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual void STDMETHODCALLTYPE RestoreGalliumState()
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GalliumD3D11ImmediateDeviceContext_RestoreGalliumState(immediate_context);
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual void STDMETHODCALLTYPE RestoreGalliumStateBlitOnly()
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		GalliumD3D11ImmediateDeviceContext_RestoreGalliumStateBlitOnly(immediate_context);
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	virtual struct pipe_context* STDMETHODCALLTYPE GetGalliumContext(void)
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	{
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		return immediate_pipe;
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	}
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SYNCHRONIZED
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1707