d3d11_context.h revision 0cf1a55568dc7e511cbd8e3f5277ccfc272e4feb
192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/**************************************************************************
292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Copyright 2010 Luca Barbieri
492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Permission is hereby granted, free of charge, to any person obtaining
692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * a copy of this software and associated documentation files (the
792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * "Software"), to deal in the Software without restriction, including
892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish,
992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to
1092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * permit persons to whom the Software is furnished to do so, subject to
1192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * the following conditions:
1292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
1392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The above copyright notice and this permission notice (including the
1492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * next paragraph) shall be included in all copies or substantial
1592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * portions of the Software.
1692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
1792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
2192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
2592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri **************************************************************************/
2692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
2792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/* used to unbind things, we need 128 due to resources */
2892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristatic const void* zero_data[128];
2992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define UPDATE_VIEWS_SHIFT (D3D11_STAGES * 0)
3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define UPDATE_SAMPLERS_SHIFT (D3D11_STAGES * 1)
3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define UPDATE_VERTEX_BUFFERS (1 << (D3D11_STAGES * 2))
3392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename PtrTraits>
3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11DeviceContext :
3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	public GalliumD3D11DeviceChild<ID3D11DeviceContext>
3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
4092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<bool threadsafe>
4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Device : public GalliumD3D10ScreenImpl<threadsafe>
4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	typedef simple_ptr_traits PtrTraits;
4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	typedef GalliumD3D10Device GalliumD3D10DeviceContext;
4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11Shader<>, PtrTraits> shaders[D3D11_STAGES];
4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11InputLayout, PtrTraits> input_layout;
4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11Buffer, PtrTraits> index_buffer;
5092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11RasterizerState, PtrTraits> rasterizer_state;
5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11DepthStencilState, PtrTraits> depth_stencil_state;
5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11BlendState, PtrTraits> blend_state;
5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11DepthStencilView, PtrTraits> depth_stencil_view;
5492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11Predicate, PtrTraits> render_predicate;
5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11Buffer, PtrTraits> constant_buffers[D3D11_STAGES][D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT];
5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11ShaderResourceView, PtrTraits> shader_resource_views[D3D11_STAGES][D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT];
5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11SamplerState, PtrTraits> samplers[D3D11_STAGES][D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT];
5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11Buffer, PtrTraits> input_buffers[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11RenderTargetView, PtrTraits> render_target_views[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
6192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<GalliumD3D11Buffer, PtrTraits> so_targets[D3D11_SO_BUFFER_SLOT_COUNT];
6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<ID3D11UnorderedAccessView, PtrTraits> cs_unordered_access_views[D3D11_PS_CS_UAV_REGISTER_COUNT];
6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	refcnt_ptr<ID3D11UnorderedAccessView, PtrTraits> om_unordered_access_views[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT];
6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D11_VIEWPORT viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
6992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D11_RECT scissor_rects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned so_offsets[D3D11_SO_BUFFER_SLOT_COUNT];
7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D11_PRIMITIVE_TOPOLOGY primitive_topology;
7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	DXGI_FORMAT index_format;
7392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned index_offset;
740cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller	uint32_t strip_cut_index;
7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	BOOL render_predicate_value;
7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	float blend_color[4];
7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned sample_mask;
7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned stencil_ref;
7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	bool depth_clamp;
8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* default_input_layout;
8292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* default_rasterizer;
8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* default_depth_stencil;
8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* default_blend;
8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* default_sampler;
8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void* ld_sampler;
8792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void * default_shaders[D3D11_STAGES];
8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	// derived state
9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	int primitive_mode;
9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_vertex_buffer vertex_buffers[D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_resource* so_buffers[D3D11_SO_BUFFER_SLOT_COUNT];
9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_sampler_view* sampler_views[D3D11_STAGES][D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT];
9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct
9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		void* ld; // accessed with a -1 index from v
9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		void* v[D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT];
9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} sampler_csos[D3D11_STAGES];
9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_resource * buffers[D3D11_SO_BUFFER_SLOT_COUNT];
10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned num_shader_resource_views[D3D11_STAGES];
10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned num_samplers[D3D11_STAGES];
10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned num_vertex_buffers;
10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned num_render_target_views;
10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned num_viewports;
10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned num_scissor_rects;
10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned num_so_targets;
10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_context* pipe;
10992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned update_flags;
11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	bool owns_pipe;
11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned context_flags;
11392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Caps caps;
11592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	cso_context* cso_ctx;
11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	gen_mipmap_state* gen_mipmap;
11892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
12092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define SYNCHRONIZED do {} while(0)
12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11DeviceContext(GalliumD3D11Screen* device, pipe_context* pipe, bool owns_pipe, unsigned context_flags = 0)
123b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11DeviceChild<ID3D11DeviceContext>(device), pipe(pipe), owns_pipe(owns_pipe), context_flags(context_flags)
12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		caps = device->screen_caps;
12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		init_context();
12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11DeviceContext()
13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		destroy_context();
13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
13392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define SYNCHRONIZED lock_t<maybe_mutex_t<threadsafe> > lock_(this->mutex)
13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Device(pipe_screen* screen, pipe_context* pipe, bool owns_pipe, unsigned creation_flags, IDXGIAdapter* adapter)
13792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10ScreenImpl<threadsafe>(screen, pipe, owns_pipe, creation_flags, adapter), pipe(pipe), owns_pipe(owns_pipe), context_flags(0)
13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		caps = this->screen_caps;
14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		init_context();
14192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D10Device()
14492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
14592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		destroy_context();
14692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
14892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void init_context()
15092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
15192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!pipe->begin_query)
15292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			caps.queries = false;
15392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!pipe->render_condition)
15492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			caps.render_condition = false;
15592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!pipe->bind_gs_state)
15692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			caps.gs = false;
15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			caps.stages = 2;
15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!pipe->set_stream_output_buffers)
16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			caps.so = false;
162f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri		if(!pipe->set_geometry_sampler_views)
163f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri			caps.stages_with_sampling &=~ (1 << PIPE_SHADER_GEOMETRY);
164f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri		if(!pipe->set_fragment_sampler_views)
165f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri			caps.stages_with_sampling &=~ (1 << PIPE_SHADER_FRAGMENT);
166f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri		if(!pipe->set_vertex_sampler_views)
167f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri			caps.stages_with_sampling &=~ (1 << PIPE_SHADER_VERTEX);
16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_flags = 0;
17092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// pipeline state
17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(viewports, 0, sizeof(viewports));
17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(scissor_rects, 0, sizeof(scissor_rects));
17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(so_offsets, 0, sizeof(so_offsets));
17592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		primitive_topology = D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED;
17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		index_format = DXGI_FORMAT_UNKNOWN;
17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		index_offset = 0;
1780cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		strip_cut_index = 0xffffffff;
17992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		render_predicate_value = 0;
18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(blend_color, 0, sizeof(blend_color));
18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		sample_mask = ~0;
18292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		stencil_ref = 0;
18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		depth_clamp = 0;
18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// derived state
18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		primitive_mode = 0;
18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(vertex_buffers, 0, sizeof(vertex_buffers));
18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(so_buffers, 0, sizeof(so_buffers));
18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(sampler_views, 0, sizeof(sampler_views));
19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(sampler_csos, 0, sizeof(sampler_csos));
19192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(num_shader_resource_views, 0, sizeof(num_shader_resource_views));
19292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(num_samplers, 0, sizeof(num_samplers));
19392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		num_vertex_buffers = 0;
19492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		num_render_target_views = 0;
19592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		num_viewports = 0;
19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		num_scissor_rects = 0;
19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		num_so_targets = 0;
19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default_input_layout = pipe->create_vertex_elements_state(pipe, 0, 0);
20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct pipe_rasterizer_state rasterizerd;
20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&rasterizerd, 0, sizeof(rasterizerd));
20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		rasterizerd.gl_rasterization_rules = 1;
20492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		rasterizerd.cull_face = PIPE_FACE_BACK;
2054a06248281f65d8a653c1bb744947bb6d47fdc9cChristoph Bumiller		rasterizerd.flatshade_first = 1;
206e27d72d6c3ca3512bfea524b8a7b007960841057Christoph Bumiller		rasterizerd.line_width = 1.0f;
207e27d72d6c3ca3512bfea524b8a7b007960841057Christoph Bumiller		rasterizerd.point_size = 1.0f;
20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default_rasterizer = pipe->create_rasterizer_state(pipe, &rasterizerd);
20992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct pipe_depth_stencil_alpha_state depth_stencild;
21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&depth_stencild, 0, sizeof(depth_stencild));
21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		depth_stencild.depth.enabled = TRUE;
21392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		depth_stencild.depth.writemask = 1;
21492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		depth_stencild.depth.func = PIPE_FUNC_LESS;
21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default_depth_stencil = pipe->create_depth_stencil_alpha_state(pipe, &depth_stencild);
21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct pipe_blend_state blendd;
21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&blendd, 0, sizeof(blendd));
21992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		blendd.rt[0].colormask = 0xf;
22092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default_blend = pipe->create_blend_state(pipe, &blendd);
22192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
22292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct pipe_sampler_state samplerd;
22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&samplerd, 0, sizeof(samplerd));
22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.normalized_coords = 1;
22592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.min_img_filter = PIPE_TEX_FILTER_LINEAR;
22692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.mag_img_filter = PIPE_TEX_FILTER_LINEAR;
22792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.min_mip_filter = PIPE_TEX_MIPFILTER_LINEAR;
22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
23192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.border_color[0] = 1.0f;
23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.border_color[1] = 1.0f;
23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.border_color[2] = 1.0f;
23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.border_color[3] = 1.0f;
23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.min_lod = -FLT_MAX;
23692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.max_lod = FLT_MAX;
23792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.max_anisotropy = 1;
23892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default_sampler = pipe->create_sampler_state(pipe, &samplerd);
23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&samplerd, 0, sizeof(samplerd));
24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.normalized_coords = 0;
24292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.min_img_filter = PIPE_TEX_FILTER_NEAREST;
24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.mag_img_filter = PIPE_TEX_FILTER_NEAREST;
24492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.min_mip_filter = PIPE_TEX_MIPFILTER_NONE;
24592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_BORDER;
24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_BORDER;
24792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_BORDER;
24892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.min_lod = -FLT_MAX;
24992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.max_lod = FLT_MAX;
25092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		samplerd.max_anisotropy = 1;
25192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ld_sampler = pipe->create_sampler_state(pipe, &samplerd);
25292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
25392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned s = 0; s < D3D11_STAGES; ++s)
25492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
25592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			sampler_csos[s].ld = ld_sampler;
25692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			for(unsigned i = 0; i < D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT; ++i)
25792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				sampler_csos[s].v[i] = default_sampler;
25892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
25992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
26092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// TODO: should this really be empty shaders, or should they be all-passthrough?
26192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(default_shaders, 0, sizeof(default_shaders));
26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct ureg_program *ureg;
26392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT);
26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ureg_END(ureg);
26592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default_shaders[PIPE_SHADER_FRAGMENT] = ureg_create_shader_and_destroy(ureg, pipe);
26692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
26792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ureg = ureg_create(TGSI_PROCESSOR_VERTEX);
26892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ureg_END(ureg);
26992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		default_shaders[PIPE_SHADER_VERTEX] = ureg_create_shader_and_destroy(ureg, pipe);
27092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
27192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		cso_ctx = cso_create_context(pipe);
27292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		gen_mipmap = util_create_gen_mipmap(pipe, cso_ctx);
27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
27492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		RestoreGalliumState();
27592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
27792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void destroy_context()
27892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
27992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		util_destroy_gen_mipmap(gen_mipmap);
28092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		cso_destroy_context(cso_ctx);
2811b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
2821b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_vertex_elements_state(pipe, 0);
28392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_vertex_elements_state(pipe, default_input_layout);
2841b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
2851b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_rasterizer_state(pipe, 0);
28692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_rasterizer_state(pipe, default_rasterizer);
2871b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
2881b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_depth_stencil_alpha_state(pipe, 0);
28992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_depth_stencil_alpha_state(pipe, default_depth_stencil);
2901b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
2911b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_blend_state(pipe, 0);
29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_blend_state(pipe, default_blend);
2931b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
2941b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_fragment_sampler_states(pipe, 0, 0);
2951b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_vertex_sampler_states(pipe, 0, 0);
2961b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		if(pipe->bind_geometry_sampler_states)
2971b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri			pipe->bind_geometry_sampler_states(pipe, 0, 0);
29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_sampler_state(pipe, default_sampler);
29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_sampler_state(pipe, ld_sampler);
3001b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
3011b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_fs_state(pipe, 0);
30292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_fs_state(pipe, default_shaders[PIPE_SHADER_FRAGMENT]);
3031b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
3041b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri		pipe->bind_vs_state(pipe, 0);
30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->delete_vs_state(pipe, default_shaders[PIPE_SHADER_VERTEX]);
3061b15a3cafdc699c63466059d56f36b295475ee9eLuca Barbieri
30792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(owns_pipe)
30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->destroy(pipe);
30992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual unsigned STDMETHODCALLTYPE GetContextFlags(void)
31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
31392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return context_flags;
31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define SET_SHADER_EXTRA_ARGS , \
3178224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri	ID3D11ClassInstance *const *ppClassInstances, \
3183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri	unsigned count
31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define GET_SHADER_EXTRA_ARGS , \
3208224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		ID3D11ClassInstance **ppClassInstances, \
3213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_count
32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define SET_SHADER_EXTRA_ARGS
32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define GET_SHADER_EXTRA_ARGS
32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
32692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
32792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/* On Windows D3D11, SetConstantBuffers and SetShaderResources crash if passed a null pointer.
32892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Instead, you have to pass a pointer to nulls to unbind things.
32992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * We do the same.
33092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * TODO: is D3D10 the same?
33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri */
33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	template<unsigned s>
33392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void xs_set_shader(GalliumD3D11Shader<>* shader)
33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
33592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(shader != shaders[s].p)
33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			shaders[s] = shader;
33892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			void* shader_cso = shader ? shader->object : default_shaders[s];
33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			switch(s)
34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
34192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			case PIPE_SHADER_VERTEX:
34292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				pipe->bind_vs_state(pipe, shader_cso);
34392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			case PIPE_SHADER_FRAGMENT:
34592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				pipe->bind_fs_state(pipe, shader_cso);
34692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
34792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			case PIPE_SHADER_GEOMETRY:
34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				pipe->bind_gs_state(pipe, shader_cso);
34992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				break;
35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_flags |= (1 << (UPDATE_SAMPLERS_SHIFT + s)) | (1 << (UPDATE_VIEWS_SHIFT + s));
35292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
35392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
35592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	template<unsigned s>
35692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void xs_set_constant_buffers(unsigned start, unsigned count, GalliumD3D11Buffer *const *constbufs)
35792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
35892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < count; ++i)
35992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
36055592d9da1bb694c7275984cf9a3ecaafcccf46aChristoph Bumiller			if(constbufs[i] != constant_buffers[s][start + i].p)
36192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
36255592d9da1bb694c7275984cf9a3ecaafcccf46aChristoph Bumiller				constant_buffers[s][start + i] = constbufs[i];
36392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(s < caps.stages && start + i < caps.constant_buffers[s])
36492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->set_constant_buffer(pipe, s, start + i, constbufs[i] ? constbufs[i]->resource : NULL);
36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
36692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
36892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
36992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	template<unsigned s>
37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void xs_set_shader_resources(unsigned start, unsigned count, GalliumD3D11ShaderResourceView *const *srvs)
37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
37292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		int last_different = -1;
37392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < count; ++i)
37492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
37592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(shader_resource_views[s][start + i].p != srvs[i])
37692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
37792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				shader_resource_views[s][start + i] = srvs[i];
37892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				sampler_views[s][start + i] = srvs[i] ? srvs[i]->object : 0;
37992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				last_different = i;
38092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
38192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
38292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(last_different >= 0)
38392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
38492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			num_shader_resource_views[s] = std::max(num_shader_resource_views[s], start + last_different + 1);
38592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_flags |= 1 << (UPDATE_VIEWS_SHIFT + s);
38692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
38792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
38892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	template<unsigned s>
39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void xs_set_samplers(unsigned start, unsigned count, GalliumD3D11SamplerState *const *samps)
39192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
39292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		int last_different = -1;
39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < count; ++i)
39492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
39592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(samplers[s][start + i].p != samps[i])
39692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
39792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				samplers[s][start + i] = samps[i];
39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				sampler_csos[s].v[start + i] = samps[i] ? samps[i]->object : default_sampler;
399974412d7b985f44c2d3a68f818d2723346a4512bChristoph Bumiller				last_different = i;
40092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
40192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(last_different >= 0)
40292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				num_samplers[s] = std::max(num_samplers[s], start + last_different + 1);
404974412d7b985f44c2d3a68f818d2723346a4512bChristoph Bumiller				update_flags |= 1 << (UPDATE_SAMPLERS_SHIFT + s);
40592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
40692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
40792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
40892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
40992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define IMPLEMENT_SHADER_STAGE(XS, Stage) \
41092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##SetShader( \
4118224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		ID3D11##Stage##Shader *pShader \
41292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SET_SHADER_EXTRA_ARGS) \
41392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
41492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
41592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		xs_set_shader<D3D11_STAGE_##XS>((GalliumD3D11Shader<>*)pShader); \
41692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} \
41792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##GetShader(\
4188224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		ID3D11##Stage##Shader **ppShader \
41992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GET_SHADER_EXTRA_ARGS) \
42092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
42192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
42292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*ppShader = (ID3D11##Stage##Shader*)shaders[D3D11_STAGE_##XS].ref(); \
42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} \
42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##SetConstantBuffers(\
4253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start, \
4263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count, \
4273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *const* constant_buffers) \
42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
4303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		xs_set_constant_buffers<D3D11_STAGE_##XS>(start, count, (GalliumD3D11Buffer *const *)constant_buffers); \
43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} \
43292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##GetConstantBuffers(\
4333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start, \
4343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count, \
4353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer **out_constant_buffers) \
43692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
43792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
4383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(unsigned i = 0; i < count; ++i) \
4393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			out_constant_buffers[i] = constant_buffers[D3D11_STAGE_##XS][start + i].ref(); \
44092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} \
44192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##SetShaderResources(\
4423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start, \
4433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count, \
4443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11ShaderResourceView *const *new_shader_resource_views) \
44592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
44692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
4473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		xs_set_shader_resources<D3D11_STAGE_##XS>(start, count, (GalliumD3D11ShaderResourceView *const *)new_shader_resource_views); \
44892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} \
44992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##GetShaderResources(\
4503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start, \
4513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count, \
4523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11ShaderResourceView **out_shader_resource_views) \
45392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
4553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(unsigned i = 0; i < count; ++i) \
4563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			out_shader_resource_views[i] = shader_resource_views[D3D11_STAGE_##XS][start + i].ref(); \
45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} \
45892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##SetSamplers(\
4593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start, \
4603e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count, \
4613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11SamplerState *const *new_samplers) \
46292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
46392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
4643e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		xs_set_samplers<D3D11_STAGE_##XS>(start, count, (GalliumD3D11SamplerState *const *)new_samplers); \
46592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	} \
46692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE XS##GetSamplers( \
4673e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start, \
4683e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count, \
4693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11SamplerState **out_samplers) \
47092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
47192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
4723e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(unsigned i = 0; i < count; ++i) \
4733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			out_samplers[i] = samplers[D3D11_STAGE_##XS][start + i].ref(); \
47492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
47592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
47692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define DO_VS(x) x
47792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define DO_GS(x) do {if(caps.gs) {x;}} while(0)
47892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define DO_PS(x) x
47992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define DO_HS(x)
48092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define DO_DS(x)
48192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define DO_CS(x)
48292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SHADER_STAGE(VS, Vertex)
48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SHADER_STAGE(GS, Geometry)
48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SHADER_STAGE(PS, Pixel)
48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
48692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
48792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SHADER_STAGE(HS, Hull)
48892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SHADER_STAGE(DS, Domain)
48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SHADER_STAGE(CS, Compute)
49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
49192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE CSSetUnorderedAccessViews(
4923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start,
4933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
4943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11UnorderedAccessView *const *new_unordered_access_views,
4953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const unsigned *new_uav_initial_counts)
49692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
49792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
4983e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(unsigned i = 0; i < count; ++i)
4993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			cs_unordered_access_views[start + i] = new_unordered_access_views[i];
50092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
50192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
50292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE CSGetUnorderedAccessViews(
5033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start,
5043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
5053e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11UnorderedAccessView **out_unordered_access_views)
50692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
50792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
5083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(unsigned i = 0; i < count; ++i)
5093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			out_unordered_access_views[i] = cs_unordered_access_views[start + i].ref();
51092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
51192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
51292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	template<unsigned s>
51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void update_stage()
51592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags & (1 << (UPDATE_VIEWS_SHIFT + s)))
51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
51892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			while(num_shader_resource_views[s] && !sampler_views[s][num_shader_resource_views[s] - 1]) \
51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				--num_shader_resource_views[s];
520f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri			if((1 << s) & caps.stages_with_sampling)
52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct pipe_sampler_view* views_to_bind[PIPE_MAX_SAMPLERS];
52392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				unsigned num_views_to_bind = shaders[s] ? shaders[s]->slot_to_resource.size() : 0;
52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				for(unsigned i = 0; i < num_views_to_bind; ++i)
52592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
52692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					views_to_bind[i] = sampler_views[s][shaders[s]->slot_to_resource[i]];
52792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				switch(s)
52992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
53092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case PIPE_SHADER_VERTEX:
53192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->set_vertex_sampler_views(pipe, num_views_to_bind, views_to_bind);
53292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case PIPE_SHADER_FRAGMENT:
53492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->set_fragment_sampler_views(pipe, num_views_to_bind, views_to_bind);
53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case PIPE_SHADER_GEOMETRY:
53792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->set_geometry_sampler_views(pipe, num_views_to_bind, views_to_bind);
53892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
54092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
54192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
54292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags & (1 << (UPDATE_SAMPLERS_SHIFT + s)))
54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			while(num_samplers[s] && !sampler_csos[s].v[num_samplers[s] - 1])
54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				--num_samplers[s];
547f1063cfee213ba92f7c9e34199caccf4bed78c1cLuca Barbieri			if((1 << s) & caps.stages_with_sampling)
54892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				void* samplers_to_bind[PIPE_MAX_SAMPLERS];
5506c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri				unsigned num_samplers_to_bind = shaders[s] ? shaders[s]->slot_to_sampler.size() : 0;
55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				for(unsigned i = 0; i < num_samplers_to_bind; ++i)
55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					// index can be -1 to access sampler_csos[s].ld
55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					samplers_to_bind[i] = *(sampler_csos[s].v + shaders[s]->slot_to_sampler[i]);
55592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				switch(s)
55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case PIPE_SHADER_VERTEX:
55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->bind_vertex_sampler_states(pipe, num_samplers_to_bind, samplers_to_bind);
56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
56192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case PIPE_SHADER_FRAGMENT:
56292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->bind_fragment_sampler_states(pipe, num_samplers_to_bind, samplers_to_bind);
56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
56492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				case PIPE_SHADER_GEOMETRY:
56592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->bind_geometry_sampler_states(pipe, num_samplers_to_bind, samplers_to_bind);
56692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					break;
56792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
56992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
57192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
57292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void update_state()
57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_stage<D3D11_STAGE_PS>();
57592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_stage<D3D11_STAGE_VS>();
57692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_stage<D3D11_STAGE_GS>();
57792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_stage<D3D11_STAGE_HS>();
57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_stage<D3D11_STAGE_DS>();
58092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_stage<D3D11_STAGE_CS>();
58192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
58292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags & UPDATE_VERTEX_BUFFERS)
58492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
58592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			while(num_vertex_buffers && !vertex_buffers[num_vertex_buffers - 1].buffer)
58692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				--num_vertex_buffers;
58792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->set_vertex_buffers(pipe, num_vertex_buffers, vertex_buffers);
58892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_flags = 0;
59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
59292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
59392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IASetInputLayout(
5943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11InputLayout *new_input_layout)
59592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
59692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
5973e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(new_input_layout != input_layout.p)
59892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
5993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			input_layout = new_input_layout;
6003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->bind_vertex_elements_state(pipe, new_input_layout ? ((GalliumD3D11InputLayout*)new_input_layout)->object : default_input_layout);
60192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
60292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
60392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IAGetInputLayout(
6053e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11InputLayout **out_input_layout)
60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
6083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		*out_input_layout = input_layout.ref();
60992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IASetVertexBuffers(
6123e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start,
6133e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
6143e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *const *new_vertex_buffers,
6153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const unsigned *new_strides,
6163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const unsigned *new_offsets)
61792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
61892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
61992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		int last_different = -1;
6203e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(unsigned i = 0; i < count; ++i)
62192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
6223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			ID3D11Buffer* buffer = new_vertex_buffers[i];
6233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			if(buffer != input_buffers[start + i].p
6243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				|| vertex_buffers[start + i].buffer_offset != new_offsets[i]
6253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				|| vertex_buffers[start + i].stride != new_offsets[i]
62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			)
62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
6283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				input_buffers[start + i] = buffer;
6293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				vertex_buffers[start + i].buffer = buffer ? ((GalliumD3D11Buffer*)buffer)->resource : 0;
6303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				vertex_buffers[start + i].buffer_offset = new_offsets[i];
6313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				vertex_buffers[start + i].stride = new_strides[i];
63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				last_different = i;
63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
63492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(last_different >= 0)
63692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
6373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			num_vertex_buffers = std::max(num_vertex_buffers, start + count);
63892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_flags |= UPDATE_VERTEX_BUFFERS;
63992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
64092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IAGetVertexBuffers(
6433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start,
6443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
6453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer **out_vertex_buffers,
6463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_strides,
6473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_offsets)
64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
6503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_vertex_buffers)
65192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
6523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 0; i < count; ++i)
6533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_vertex_buffers[i] = input_buffers[start + i].ref();
65492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
65592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_offsets)
65792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
6583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 0; i < count; ++i)
6593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_offsets[i] = vertex_buffers[start + i].buffer_offset;
66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
66192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6623e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_strides)
66392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
6643e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 0; i < count; ++i)
6653e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_strides[i] = vertex_buffers[start + i].stride;
66692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
66792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
66992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void set_index_buffer()
67092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
67192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_index_buffer ib;
67292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!index_buffer)
67392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
67492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			memset(&ib, 0, sizeof(ib));
67592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
67692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
67792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
6780cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller			switch(index_format) {
6790cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller			case DXGI_FORMAT_R32_UINT:
68092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ib.index_size = 4;
6810cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller				strip_cut_index = 0xffffffff;
6820cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller				break;
6830cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller			case DXGI_FORMAT_R16_UINT:
68492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ib.index_size = 2;
6850cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller				strip_cut_index = 0xffff;
6860cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller				break;
6870cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller			default:
68892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				ib.index_size = 1;
6890cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller				strip_cut_index = 0xff;
6900cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller				break;
6910cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller			}
69292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			ib.offset = index_offset;
69392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			ib.buffer = index_buffer ? ((GalliumD3D11Buffer*)index_buffer.p)->resource : 0;
69492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
69592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_index_buffer(pipe, &ib);
69692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
69792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
69892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IASetIndexBuffer(
6993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *new_index_buffer,
7003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		DXGI_FORMAT new_index_format,
7013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned new_index_offset)
70292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
7043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(index_buffer.p != new_index_buffer || index_format != new_index_format || index_offset != new_index_offset)
70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
7063e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			index_buffer = new_index_buffer;
7073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			index_format = new_index_format;
7083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			index_offset = new_index_offset;
70992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
71092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			set_index_buffer();
71192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
71292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
71492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IAGetIndexBuffer(
7153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer **out_index_buffer,
7163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		DXGI_FORMAT *out_index_format,
7173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_index_offset)
71892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
71992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
7203e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_index_buffer)
7213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_index_buffer = index_buffer.ref();
7223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_index_format)
7233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_index_format = index_format;
7243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_index_offset)
7253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_index_offset = index_offset;
72692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
72792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
72892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IASetPrimitiveTopology(
7293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		D3D11_PRIMITIVE_TOPOLOGY new_primitive_topology)
73092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
73192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
7323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(primitive_topology != new_primitive_topology)
73392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
7343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			if(new_primitive_topology < D3D_PRIMITIVE_TOPOLOGY_COUNT)
7353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				primitive_mode = d3d_to_pipe_prim[new_primitive_topology];
73692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			else
73792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				primitive_mode = 0;
7383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			primitive_topology = new_primitive_topology;
73992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
74092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
74192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
74292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE IAGetPrimitiveTopology(
7433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		D3D11_PRIMITIVE_TOPOLOGY *out_primitive_topology)
74492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
74592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
7463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		*out_primitive_topology = primitive_topology;
74792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
74892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
74992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE DrawIndexed(
7503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned index_count,
7513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start_index_location,
7523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		int base_vertex_location)
75392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
75492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
75592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags)
75692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_state();
75792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
75892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_draw_info info;
75992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.mode = primitive_mode;
76092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.indexed = TRUE;
7613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.count = index_count;
7623e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.start = start_index_location;
7633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.index_bias = base_vertex_location;
76492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.min_index = 0;
76592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.max_index = ~0;
76692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.start_instance = 0;
76792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.instance_count = 1;
7680cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.primitive_restart = FALSE;
76992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
77092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->draw_vbo(pipe, &info);
77192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
77292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
77392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE Draw(
7743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned vertex_count,
7753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start_vertex_location)
77692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
77792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
77892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags)
77992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_state();
78092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
78192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_draw_info info;
78292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.mode = primitive_mode;
78392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.indexed = FALSE;
7843e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.count = vertex_count;
7853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.start = start_vertex_location;
78692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.index_bias = 0;
78792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.min_index = 0;
78892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.max_index = ~0;
78992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.start_instance = 0;
79092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.instance_count = 1;
7910cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.primitive_restart = TRUE;
7920cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.restart_index = strip_cut_index;
79392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
79492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->draw_vbo(pipe, &info);
79592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
79692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
79792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE DrawIndexedInstanced(
7983e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned index_countPerInstance,
7993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned instance_count,
8003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start_index_location,
8013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		int base_vertex_location,
8023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start_instance_location)
80392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
80492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
80592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags)
80692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_state();
80792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
80892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_draw_info info;
80992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.mode = primitive_mode;
81092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.indexed = TRUE;
8113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.count = index_countPerInstance;
8123e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.start = start_index_location;
8133e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.index_bias = base_vertex_location;
81492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.min_index = 0;
81592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.max_index = ~0;
8163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.start_instance = start_instance_location;
8173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.instance_count = instance_count;
8180cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.primitive_restart = FALSE;
81992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
82092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->draw_vbo(pipe, &info);
82192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
82292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
82392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE DrawInstanced(
8243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned vertex_countPerInstance,
8253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned instance_count,
8263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start_vertex_location,
8273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned start_instance_location)
82892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
82992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
83092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags)
83192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_state();
83292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
83392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_draw_info info;
83492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.mode = primitive_mode;
83592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.indexed = FALSE;
8363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.count = vertex_countPerInstance;
8373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.start = start_vertex_location;
83892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.index_bias = 0;
83992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.min_index = 0;
84092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.max_index = ~0;
8413e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.start_instance = start_instance_location;
8423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		info.instance_count = instance_count;
8430cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.primitive_restart = TRUE;
8440cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.restart_index = strip_cut_index;
84592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
84692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->draw_vbo(pipe, &info);
84792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
84892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
84992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE DrawAuto(void)
85092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
85192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!caps.so)
85292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return;
85392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
85492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
85592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags)
85692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_state();
85792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
85892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->draw_stream_output(pipe, primitive_mode);
85992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
86092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
86192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE DrawIndexedInstancedIndirect(
8623e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *buffer,
8633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned aligned_byte_offset)
86492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
86592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
86692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags)
86792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_state();
86892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
86992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct {
87092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned count;
87192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned instance_count;
87292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned start;
87392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned index_bias;
87492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		} data;
87592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		pipe_buffer_read(pipe, ((GalliumD3D11Buffer*)buffer)->resource, aligned_byte_offset, sizeof(data), &data);
87792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
87892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_draw_info info;
87992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.mode = primitive_mode;
88092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.indexed = TRUE;
88192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.start = data.start;
88292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.count = data.count;
88392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.index_bias = data.index_bias;
88492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.min_index = 0;
88592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.max_index = ~0;
88692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.start_instance = 0;
88792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.instance_count = data.instance_count;
8880cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.primitive_restart = FALSE;
88992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
89092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->draw_vbo(pipe, &info);
89192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
89292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
89392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE DrawInstancedIndirect(
8943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *buffer,
8953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned aligned_byte_offset)
89692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
89792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
89892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(update_flags)
89992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			update_state();
90092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
90192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct {
90292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned count;
90392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned instance_count;
90492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned start;
90592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		} data;
90692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		pipe_buffer_read(pipe, ((GalliumD3D11Buffer*)buffer)->resource, aligned_byte_offset, sizeof(data), &data);
90892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
90992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_draw_info info;
91092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.mode = primitive_mode;
91192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.indexed = FALSE;
91292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.start = data.start;
91392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.count = data.count;
91492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.index_bias = 0;
91592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.min_index = 0;
91692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.max_index = ~0;
91792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.start_instance = 0;
91892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		info.instance_count = data.instance_count;
9190cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.primitive_restart = TRUE;
9200cf1a55568dc7e511cbd8e3f5277ccfc272e4febChristoph Bumiller		info.restart_index = strip_cut_index;
92192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
92292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->draw_vbo(pipe, &info);
92392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
92492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
92592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
92692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE Dispatch(
9273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned thread_group_count_x,
9283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned thread_group_count_y,
9293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned thread_group_count_z)
93092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
93192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// uncomment this when this is implemented
93292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//		SYNCHRONIZED;
93392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//		if(update_flags)
93492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//			update_state();
93592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
93692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
93792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE DispatchIndirect(
9383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *buffer,
9393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned aligned_byte_offset)
94092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
94192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// uncomment this when this is implemented
94292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//		SYNCHRONIZED;
94392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//		if(update_flags)
94492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri//			update_state();
94592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
94692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
94792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
94892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void set_clip()
94992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
95092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_clip_state clip;
95192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		clip.nr = 0;
95292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		clip.depth_clamp = depth_clamp;
95392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_clip_state(pipe, &clip);
95492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
95592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
95692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE RSSetState(
9573e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11RasterizerState *new_rasterizer_state)
95892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
95992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
9603e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(new_rasterizer_state != rasterizer_state.p)
96192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
9623e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			rasterizer_state = new_rasterizer_state;
9633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->bind_rasterizer_state(pipe, new_rasterizer_state ? ((GalliumD3D11RasterizerState*)new_rasterizer_state)->object : default_rasterizer);
9643e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			bool new_depth_clamp = new_rasterizer_state ? ((GalliumD3D11RasterizerState*)new_rasterizer_state)->depth_clamp : false;
96592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(depth_clamp != new_depth_clamp)
96692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
96792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				depth_clamp = new_depth_clamp;
96892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				set_clip();
96992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
97092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
97192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
97292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
97392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE RSGetState(
9743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11RasterizerState **out_rasterizer_state)
97592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
97692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
9773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		*out_rasterizer_state = rasterizer_state.ref();
97892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
97992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
98092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void set_viewport()
98192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
98292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// TODO: is depth correct? it seems D3D10/11 uses a [-1,1]x[-1,1]x[0,1] cube
98392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_viewport_state viewport;
98492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		float half_width = viewports[0].Width * 0.5f;
98592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		float half_height = viewports[0].Height * 0.5f;
98692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
98792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.scale[0] = half_width;
98892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.scale[1] = -half_height;
98992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.scale[2] = (viewports[0].MaxDepth - viewports[0].MinDepth);
99092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.scale[3] = 1.0f;
99192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.translate[0] = half_width + viewports[0].TopLeftX;
99292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.translate[1] = half_height + viewports[0].TopLeftY;
99392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.translate[2] = viewports[0].MinDepth;
99492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		viewport.translate[3] = 1.0f;
99592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_viewport_state(pipe, &viewport);
99692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
99792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
99892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE RSSetViewports(
9993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
10003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const D3D11_VIEWPORT *new_viewports)
100192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
100292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
10033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(count)
100492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
10053e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			if(memcmp(&viewports[0], &new_viewports[0], sizeof(viewports[0])))
100692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
10073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				viewports[0] = new_viewports[0];
100892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				set_viewport();
100992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
10103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 1; i < count; ++i)
10113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				viewports[i] = new_viewports[i];
101292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
101392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else if(num_viewports)
101492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
101592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// TODO: what should we do here?
101692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			memset(&viewports[0], 0, sizeof(viewports[0]));
101792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			set_viewport();
101892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
10193e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		num_viewports = count;
102092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
102192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
102292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE RSGetViewports(
10233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_count,
10243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		D3D11_VIEWPORT *out_viewports)
102592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
102692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
10273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_viewports)
102892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
102992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned i;
10303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(i = 0; i < std::min(*out_count, num_viewports); ++i)
10313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_viewports[i] = viewports[i];
103292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			memset(out_viewports + i, 0, (*out_count - i) * sizeof(D3D11_VIEWPORT));
103492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
103592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		*out_count = num_viewports;
103792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
103892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
103992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void set_scissor()
104092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
104192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_scissor_state scissor;
104292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		scissor.minx = scissor_rects[0].left;
104392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		scissor.miny = scissor_rects[0].top;
104492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		scissor.maxx = scissor_rects[0].right;
104592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		scissor.maxy = scissor_rects[0].bottom;
104692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_scissor_state(pipe, &scissor);
104792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
104892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
104992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE RSSetScissorRects(
10503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
10513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const D3D11_RECT *new_rects)
105292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
105392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
10543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(count)
105592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
10563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			if(memcmp(&scissor_rects[0], &new_rects[0], sizeof(scissor_rects[0])))
105792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
10583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				scissor_rects[0] = new_rects[0];
105992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				set_scissor();
106092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
10613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 1; i < count; ++i)
10623e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				scissor_rects[i] = new_rects[i];
106392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
106492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else if(num_scissor_rects)
106592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
106692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// TODO: what should we do here?
106792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			memset(&scissor_rects[0], 0, sizeof(scissor_rects[0]));
106892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			set_scissor();
106992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
107092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10713e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		num_scissor_rects = count;
107292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
107392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
107492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE RSGetScissorRects(
10753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_count,
10763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		D3D11_RECT *out_rects)
107792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
107892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
10793e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_rects)
108092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
108192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned i;
10823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(i = 0; i < std::min(*out_count, num_scissor_rects); ++i)
10833e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_rects[i] = scissor_rects[i];
108492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			memset(out_rects + i, 0, (*out_count - i) * sizeof(D3D11_RECT));
108692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
108792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		*out_count = num_scissor_rects;
108992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
109092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
109192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMSetBlendState(
10923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11BlendState *new_blend_state,
10933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const float new_blend_factor[4],
10943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned new_sample_mask)
109592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
109692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
109792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		float white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
109892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10993e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(blend_state.p != new_blend_state)
110092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
11013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->bind_blend_state(pipe, new_blend_state ? ((GalliumD3D11BlendState*)new_blend_state)->object : default_blend);
11023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			blend_state = new_blend_state;
110392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
110492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
110592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// Windows D3D11 does this, even though it's apparently undocumented
11063e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(!new_blend_factor)
11073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			new_blend_factor = white;
110892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(memcmp(blend_color, new_blend_factor, sizeof(blend_color)))
111092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
11113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->set_blend_color(pipe, (struct pipe_blend_color*)new_blend_factor);
11123e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			memcpy(blend_color, new_blend_factor, sizeof(blend_color));
111392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
111492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(sample_mask != new_sample_mask)
111692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
11173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->set_sample_mask(pipe, new_sample_mask);
11183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			sample_mask = new_sample_mask;
111992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
112092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
112192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
112292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMGetBlendState(
11233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11BlendState **out_blend_state,
11243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		float out_blend_factor[4],
11253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_sample_mask)
112692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
112792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
11283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_blend_state)
11293e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_blend_state = blend_state.ref();
11303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_blend_factor)
11313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			memcpy(out_blend_factor, blend_color, sizeof(blend_color));
11323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_sample_mask)
11333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_sample_mask = sample_mask;
113492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
113592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
113692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void set_stencil_ref()
113792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
113892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct pipe_stencil_ref sref;
113992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		sref.ref_value[0] = stencil_ref;
114092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		sref.ref_value[1] = stencil_ref;
114192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_stencil_ref(pipe, &sref);
114292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
114392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
114492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMSetDepthStencilState(
11453e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11DepthStencilState *new_depth_stencil_state,
11463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned new_stencil_ref)
114792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
114892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
11493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(new_depth_stencil_state != depth_stencil_state.p)
115092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
11513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->bind_depth_stencil_alpha_state(pipe, new_depth_stencil_state ? ((GalliumD3D11DepthStencilState*)new_depth_stencil_state)->object : default_depth_stencil);
11523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			depth_stencil_state = new_depth_stencil_state;
115392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
115492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(new_stencil_ref != stencil_ref)
115692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
11573e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			stencil_ref = new_stencil_ref;
115892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			set_stencil_ref();
115992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
116092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
116192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
116292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMGetDepthStencilState(
11633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11DepthStencilState **out_depth_stencil_state,
11643e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned *out_stencil_ref)
116592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
116692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
11673e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(*out_depth_stencil_state)
11683e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_depth_stencil_state = depth_stencil_state.ref();
11693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_stencil_ref)
11703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_stencil_ref = stencil_ref;
117192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
117292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
117392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void set_framebuffer()
117492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
117592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		struct pipe_framebuffer_state fb;
117692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&fb, 0, sizeof(fb));
117792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(depth_stencil_view)
117892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
117992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			struct pipe_surface* surf = ((GalliumD3D11DepthStencilView*)depth_stencil_view.p)->object;
118092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			fb.zsbuf = surf;
118192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(surf->width > fb.width)
118292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				fb.width = surf->width;
118392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(surf->height > fb.height)
118492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				fb.height = surf->height;
118592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
118692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		fb.nr_cbufs = num_render_target_views;
118792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned i;
118892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(i = 0; i < num_render_target_views; ++i)
118992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
119092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(render_target_views[i])
119192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
119292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				struct pipe_surface* surf = ((GalliumD3D11RenderTargetView*)render_target_views[i].p)->object;
119392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				fb.cbufs[i] = surf;
119492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(surf->width > fb.width)
119592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					fb.width = surf->width;
119692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(surf->height > fb.height)
119792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					fb.height = surf->height;
119892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
119992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
120092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
120192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_framebuffer_state(pipe, &fb);
120292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
120392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
120492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* TODO: the docs say that we should unbind conflicting resources (e.g. those bound for read while we are binding them for write too), but we aren't.
120592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * Hopefully nobody relies on this happening
120692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 */
120792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
120892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMSetRenderTargets(
12093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
12103e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11RenderTargetView *const *new_render_target_views,
12113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11DepthStencilView  *new_depth_stencil_view)
121292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
121392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
12143e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(!new_render_target_views)
12153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			count = 0;
12163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(count == num_render_target_views)
121792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
12183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 0; i < count; ++i)
121992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
12203e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				if(new_render_target_views[i] != render_target_views[i].p)
122192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					goto changed;
122292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
122392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return;
122492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
122592617aeac109481258f0c3863d09c1b8903d438bLuca Barbierichanged:
12263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		depth_stencil_view = new_depth_stencil_view;
122792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned i;
12283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(i = 0; i < count; ++i)
122992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
12303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			render_target_views[i] = new_render_target_views[i];
123192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
123292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			om_unordered_access_views[i] = (ID3D11UnorderedAccessView*)NULL;
123392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
123492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
123592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(; i < num_render_target_views; ++i)
123692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			render_target_views[i] = (ID3D11RenderTargetView*)NULL;
12373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		num_render_target_views = count;
123892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_framebuffer();
123992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
124092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
124192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMGetRenderTargets(
12423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
12433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11RenderTargetView **out_render_target_views,
12443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11DepthStencilView  **out_depth_stencil_view)
124592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
124692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
12473e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_render_target_views)
124892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
124992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned i;
12503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(i = 0; i < std::min(num_render_target_views, count); ++i)
12513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_render_target_views[i] = render_target_views[i].ref();
125292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(; i < count; ++i)
12543e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_render_target_views[i] = 0;
125592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
125692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12573e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_depth_stencil_view)
12583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_depth_stencil_view = depth_stencil_view.ref();
125992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
126092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
126192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
126292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* TODO: what is this supposed to do _exactly_? are we doing the right thing? */
126392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMSetRenderTargetsAndUnorderedAccessViews(
12643e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned rtv_count,
12653e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11RenderTargetView *const *new_render_target_views,
12663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11DepthStencilView  *new_depth_stencil_view,
12673e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned uav_start,
12683e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned uav_count,
12693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11UnorderedAccessView *const *new_unordered_access_views,
12703e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const unsigned *new_uav_initial_counts)
127192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
127292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
12733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(rtv_count != D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL)
12743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			OMSetRenderTargets(rtv_count, new_render_target_views, new_depth_stencil_view);
127592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(uav_count != D3D11_KEEP_UNORDERED_ACCESS_VIEWS)
127792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
12783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 0; i < uav_count; ++i)
127992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
12803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				om_unordered_access_views[uav_start + i] = new_unordered_access_views[i];
12813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				render_target_views[uav_start + i] = (ID3D11RenderTargetView*)0;
128292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
128392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
128492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
128592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
128692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE OMGetRenderTargetsAndUnorderedAccessViews(
12873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned rtv_count,
12883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11RenderTargetView **out_render_target_views,
12893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11DepthStencilView  **out_depth_stencil_view,
12903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned uav_start,
12913e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned uav_count,
12923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11UnorderedAccessView **out_unordered_access_views)
129392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
129492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
12953e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_render_target_views)
12963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			OMGetRenderTargets(rtv_count, out_render_target_views, out_depth_stencil_view);
129792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12983e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_unordered_access_views)
129992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
13003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			for(unsigned i = 0; i < uav_count; ++i)
13013e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				out_unordered_access_views[i] = om_unordered_access_views[uav_start + i].ref();
130292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
130392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
130492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
130592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
130692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE SOSetTargets(
13073e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
13083e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *const *new_so_targets,
13093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const unsigned *new_offsets)
131092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
131192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
131292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned i;
13133e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(!new_so_targets)
13143e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			count = 0;
131592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		bool changed = false;
13163e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(i = 0; i < count; ++i)
131792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
13183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			ID3D11Buffer* buffer = new_so_targets[i];
13193e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			if(buffer != so_targets[i].p || new_offsets[i] != so_offsets[i])
132092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
132192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				so_buffers[i] = buffer ? ((GalliumD3D11Buffer*)buffer)->resource : 0;
132292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				so_targets[i] = buffer;
13233e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri				so_offsets[i] = new_offsets[i];
132492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				changed = true;
132592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
132692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
132792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(; i < D3D11_SO_BUFFER_SLOT_COUNT; ++i)
132892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
132992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(so_targets[i].p || so_offsets[i])
133092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
133192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				changed = true;
133292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				so_targets[i] = (ID3D11Buffer*)0;
133392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				so_offsets[i] = 0;
133492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
133592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
13363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		num_so_targets = count;
133792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
133892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(changed && caps.so)
133992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->set_stream_output_buffers(pipe, so_buffers, (int*)so_offsets, num_so_targets);
134092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
134192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
134292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE SOGetTargets(
13433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned count,
13443e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer **out_so_targets
134592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API < 11
13463e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		, UINT *out_offsets
134792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
134892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		)
134992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
135092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
13513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		for(unsigned i = 0; i < count; ++i)
135292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
13533e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			out_so_targets[i] = so_targets[i].ref();
135492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API < 11
13553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			out_offsets[i] = so_offsets[i];
135692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
135792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
135892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
135992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
136092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE Begin(
13613e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Asynchronous *async)
136292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
136392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
136492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(caps.queries)
13653e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->begin_query(pipe, ((GalliumD3D11Asynchronous<>*)async)->query);
136692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
136792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
136892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE End(
13693e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Asynchronous *async)
137092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
137192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
137292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(caps.queries)
13733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			pipe->end_query(pipe, ((GalliumD3D11Asynchronous<>*)async)->query);
137492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
137592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
137692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetData(
13773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Asynchronous *iasync,
13783e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		void *out_data,
13793e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned data_size,
13803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned get_data_flags)
138192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
138292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
138392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!caps.queries)
138492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOTIMPL;
138592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Asynchronous<>* async = (GalliumD3D11Asynchronous<>*)iasync;
13873e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		void* tmp_data = alloca(async->data_size);
13883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		boolean ret = pipe->get_query_result(pipe, async->query, !(get_data_flags & D3D11_ASYNC_GETDATA_DONOTFLUSH), tmp_data);
13893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_data)
13903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			memcpy(out_data, tmp_data, std::min(async->data_size, data_size));
139192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return ret ? S_OK : S_FALSE;
139292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
139392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
139492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void set_render_condition()
139592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
139692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(caps.render_condition)
139792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
139892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(!render_predicate)
139992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				pipe->render_condition(pipe, 0, 0);
140092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			else
140192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
140292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				GalliumD3D11Predicate* predicate = (GalliumD3D11Predicate*)render_predicate.p;
140392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(!render_predicate_value && predicate->desc.Query == D3D11_QUERY_OCCLUSION_PREDICATE)
140492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
140592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					unsigned mode = (predicate->desc.MiscFlags & D3D11_QUERY_MISC_PREDICATEHINT) ? PIPE_RENDER_COND_NO_WAIT : PIPE_RENDER_COND_WAIT;
140692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->render_condition(pipe, predicate->query, mode);
140792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
140892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
140992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
141092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					/* TODO: add inverted predication to Gallium*/
141192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->render_condition(pipe, 0, 0);
141292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
141392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
141492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
141592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
141692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
141792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE SetPredication(
14183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Predicate *new_predicate,
14193e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		BOOL new_predicate_value)
142092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
142192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
14223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(render_predicate.p != new_predicate || render_predicate_value != new_predicate_value)
142392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
14243e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			render_predicate = new_predicate;
14253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			render_predicate_value = new_predicate_value;
142692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			set_render_condition();
142792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
142892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
142992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
143092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetPredication(
14313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Predicate **out_predicate,
14323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		BOOL *out_predicate_value)
143392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
143492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
14353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_predicate)
14363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_predicate = render_predicate.ref();
14373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(out_predicate_value)
14383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			*out_predicate_value = render_predicate_value;
143992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
144092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	static unsigned d3d11_subresource_to_level(struct pipe_resource* resource, unsigned subresource)
144292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
144392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(subresource <= resource->last_level)
144492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
14454c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			return subresource;
144692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
144792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
144892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
144992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned levels = resource->last_level + 1;
14504c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			return subresource % levels;
145192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
145292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
145392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14544c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	static unsigned d3d11_subresource_to_face(struct pipe_resource* resource, unsigned subresource)
14554c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	{
14564c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		if(subresource <= resource->last_level)
14574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		{
14584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			return 0;
14594c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		}
14604c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		else
14614c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		{
14624c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			unsigned levels = resource->last_level + 1;
14634c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			return subresource / levels;
14644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		}
14654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger	}
14664c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
14674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger
1468a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri	/* TODO: deferred contexts will need a different implementation of this,
1469a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri	 * because we can't put the transfer info into the resource itself.
1470a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri	 * Also, there are very different restrictions, for obvious reasons.
1471a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri	 */
147292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
14733e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *iresource,
14743e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned subresource,
14753e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		D3D11_MAP map_type,
14763e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned map_flags,
14773e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		D3D11_MAPPED_SUBRESOURCE *mapped_resource)
147892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
147992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
14803e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* resource = (GalliumD3D11Resource<>*)iresource;
14813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(resource->transfers.count(subresource))
148292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_FAIL;
14834c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned level = d3d11_subresource_to_level(resource->resource, subresource);
14844c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned face = d3d11_subresource_to_face(resource->resource, subresource);
14854c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		pipe_box box = d3d11_to_pipe_box(resource->resource, level, 0);
14864c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		/* XXX the translation from subresource to level/face(zslice/array layer) isn't quite right */
148792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned usage = 0;
14883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(map_type == D3D11_MAP_READ)
148992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			usage = PIPE_TRANSFER_READ;
14903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		else if(map_type == D3D11_MAP_WRITE)
149192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			usage = PIPE_TRANSFER_WRITE;
14923e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		else if(map_type == D3D11_MAP_READ_WRITE)
149392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			usage = PIPE_TRANSFER_READ_WRITE;
14943e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		else if(map_type == D3D11_MAP_WRITE_DISCARD)
149592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			usage = PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD;
14963e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		else if(map_type == D3D11_MAP_WRITE_NO_OVERWRITE)
149792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			usage = PIPE_TRANSFER_WRITE | PIPE_TRANSFER_NOOVERWRITE;
149892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
149992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_INVALIDARG;
15003e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(map_type & D3D10_MAP_FLAG_DO_NOT_WAIT)
150192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			usage |= PIPE_TRANSFER_DONTBLOCK;
15024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		struct pipe_transfer* transfer = pipe->get_transfer(pipe, resource->resource, level, usage, &box);
150392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!transfer) {
15043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			if(map_type & D3D10_MAP_FLAG_DO_NOT_WAIT)
150592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				return DXGI_ERROR_WAS_STILL_DRAWING;
150692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			else
150792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				return E_FAIL;
150892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
15093e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		resource->transfers[subresource] = transfer;
1510a359eb80c5e141f625cfe42b4d97bf78cf25d128Luca Barbieri		mapped_resource->pData = pipe->transfer_map(pipe, transfer);
15113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		mapped_resource->RowPitch = transfer->stride;
15124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		mapped_resource->DepthPitch = transfer->layer_stride;
151392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
151492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
151592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
151692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE Unmap(
15173e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *iresource,
15183e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned subresource)
151992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
152092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
15213e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* resource = (GalliumD3D11Resource<>*)iresource;
15223e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		std::unordered_map<unsigned, pipe_transfer*>::iterator i = resource->transfers.find(subresource);
152392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(i != resource->transfers.end())
152492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
152592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->transfer_unmap(pipe, i->second);
15266c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri			pipe->transfer_destroy(pipe, i->second);
152792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			resource->transfers.erase(i);
152892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
152992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
153092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
153192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE CopySubresourceRegion(
15323e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *dst_resource,
15333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned dst_subresource,
15343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned dst_x,
15353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned dst_y,
15363e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned dst_z,
15373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *src_resource,
15383e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned src_subresource,
15393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const D3D11_BOX *src_box)
154092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
154192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
15423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* dst = (GalliumD3D11Resource<>*)dst_resource;
15433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* src = (GalliumD3D11Resource<>*)src_resource;
15444c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned dst_level = d3d11_subresource_to_level(dst->resource, dst_subresource);
15454c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned dst_face = d3d11_subresource_to_face(dst->resource, dst_subresource);
15464c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned src_level = d3d11_subresource_to_level(src->resource, src_subresource);
15474c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned src_face = d3d11_subresource_to_face(src->resource, src_subresource);
15484c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		/* XXX the translation from subresource to level/face(zslice/array layer) isn't quite right */
15494c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		pipe_box box = d3d11_to_pipe_box(src->resource, src_level, src_box);
155092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
155192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->resource_copy_region(pipe,
15524c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				dst->resource, dst_level, dst_x, dst_y, dst_z,
15534c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				src->resource, src_level, &box);
155492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
155592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
155692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
155792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE CopyResource(
15583e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *dst_resource,
15593e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *src_resource)
156092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
156192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
15623e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* dst = (GalliumD3D11Resource<>*)dst_resource;
15633e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* src = (GalliumD3D11Resource<>*)src_resource;
15644c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned level;
15654c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		for(level = 0; level <= dst->resource->last_level; ++level)
156692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
15674c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		        unsigned layers = 1;
15684c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			pipe_box box;
15694c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			if (dst->resource->target == PIPE_TEXTURE_CUBE)
15704c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				layers = 6;
15714c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			else if (dst->resource->target == PIPE_TEXTURE_3D)
15724c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger				layers = u_minify(dst->resource->depth0, level);
15734c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			/* else layers = dst->resource->array_size; */
15744c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			box.x = box.y = box.z = 0;
15754c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			box.width = u_minify(dst->resource->width0, level);
15764c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			box.height = u_minify(dst->resource->height0, level);
15774c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			box.depth = layers;
15784c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger			pipe->resource_copy_region(pipe,
15794c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger						   dst->resource, level, 0, 0, 0,
15804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger						   src->resource, level, &box);
158192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
158292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
158392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
158492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE UpdateSubresource(
15853e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *dst_resource,
15863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned dst_subresource,
15878224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		const D3D11_BOX *pDstBox,
15888224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		const void *pSrcData,
15893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned src_row_pitch,
15903e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned src_depth_pitch)
159192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
159292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
15933e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* dst = (GalliumD3D11Resource<>*)dst_resource;
15944c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		unsigned dst_level = d3d11_subresource_to_level(dst->resource, dst_subresource);
15954c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		/* XXX the translation from subresource to level/face(zslice/array layer) isn't quite right */
15964c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		pipe_box box = d3d11_to_pipe_box(dst->resource, dst_level, pDstBox);
15974c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger		pipe->transfer_inline_write(pipe, dst->resource, dst_level, PIPE_TRANSFER_WRITE, &box, pSrcData, src_row_pitch, src_depth_pitch);
159892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
159992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
160092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
160192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE CopyStructureCount(
16023e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Buffer *dst_buffer,
16033e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned dst_aligned_byte_offset,
16043e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11UnorderedAccessView *src_view)
160592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
160692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
160792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
160892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
160992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
161092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE ClearRenderTargetView(
16113e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11RenderTargetView *render_target_view,
16123e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const float color[4])
161392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
161492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
16153e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11RenderTargetView* view = ((GalliumD3D11RenderTargetView*)render_target_view);
16166dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		union pipe_color_union cc;
16176dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		cc.f[0] = color[0];
16186dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		cc.f[1] = color[1];
16196dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		cc.f[2] = color[2];
16206dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		cc.f[3] = color[3];
16216dd284f7c8fac22f64c13fdf9909094f5ec59086Dave Airlie		pipe->clear_render_target(pipe, view->object, &cc, 0, 0, view->object->width, view->object->height);
162292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
162392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
162492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE ClearDepthStencilView(
16253e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11DepthStencilView  *depth_stencil_view,
16263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned clear_flags,
16273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		float depth,
16283e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		UINT8 stencil)
162992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
163092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
16313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11DepthStencilView* view = ((GalliumD3D11DepthStencilView*)depth_stencil_view);
163292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned flags = 0;
16333e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(clear_flags & D3D11_CLEAR_DEPTH)
163492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			flags |= PIPE_CLEAR_DEPTH;
16353e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(clear_flags & D3D11_CLEAR_STENCIL)
163692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			flags |= PIPE_CLEAR_STENCIL;
16373e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		pipe->clear_depth_stencil(pipe, view->object, flags, depth, stencil, 0, 0, view->object->width, view->object->height);
163892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
163992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
164092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
164192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE ClearUnorderedAccessViewUint(
16423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11UnorderedAccessView *unordered_access_view,
16433e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		const unsigned values[4])
164492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
164592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
164692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
164792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
164892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE ClearUnorderedAccessViewFloat(
16493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			ID3D11UnorderedAccessView *unordered_access_view,
16503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			const float values[4])
165192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
165292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
165392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
165492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
165592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
165617ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri	void restore_gallium_state_blit_only()
165792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
165892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->bind_blend_state(pipe, blend_state.p ? blend_state.p->object : default_blend);
165992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->bind_depth_stencil_alpha_state(pipe, depth_stencil_state.p ? depth_stencil_state.p->object : default_depth_stencil);
166092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->bind_rasterizer_state(pipe, rasterizer_state.p ? rasterizer_state.p->object : default_rasterizer);
166192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->bind_vertex_elements_state(pipe, input_layout.p ? input_layout.p->object : default_input_layout);
166292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->bind_fs_state(pipe, shaders[D3D11_STAGE_PS].p ? shaders[D3D11_STAGE_PS].p->object : default_shaders[PIPE_SHADER_FRAGMENT]);
166392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->bind_vs_state(pipe, shaders[D3D11_STAGE_VS].p ? shaders[D3D11_STAGE_VS].p->object : default_shaders[PIPE_SHADER_VERTEX]);
166492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(caps.gs)
166592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->bind_gs_state(pipe, shaders[D3D11_STAGE_GS].p ? shaders[D3D11_STAGE_GS].p->object : default_shaders[PIPE_SHADER_GEOMETRY]);
166692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_framebuffer();
166792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_viewport();
166892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_clip();
166992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_render_condition();
167092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// TODO: restore stream output
167192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
167292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_flags |= UPDATE_VERTEX_BUFFERS | (1 << (UPDATE_SAMPLERS_SHIFT + D3D11_STAGE_PS)) | (1 << (UPDATE_VIEWS_SHIFT + D3D11_STAGE_PS));
167392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
167492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
167517ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri	virtual void STDMETHODCALLTYPE RestoreGalliumStateBlitOnly()
167617ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri	{
167717ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		SYNCHRONIZED;
167817ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		restore_gallium_state_blit_only();
167917ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri	}
168017ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri
168192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GenerateMips(
16823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11ShaderResourceView *shader_resource_view)
168392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
168492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
168592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
16863e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11ShaderResourceView* view = (GalliumD3D11ShaderResourceView*)shader_resource_view;
168792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(caps.gs)
168892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->bind_gs_state(pipe, 0);
168992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(caps.so)
169092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->bind_stream_output_state(pipe, 0);
169192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(pipe->render_condition)
169292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->render_condition(pipe, 0, 0);
169392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		util_gen_mipmap(gen_mipmap, view->object, 0, 0, view->object->texture->last_level, PIPE_TEX_FILTER_LINEAR);
169417ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		restore_gallium_state_blit_only();
169592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
169692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
169792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE RestoreGalliumState()
169892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
169992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
170017ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		restore_gallium_state_blit_only();
170192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
170292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_index_buffer();
170392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_stencil_ref();
170492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_blend_color(pipe, (struct pipe_blend_color*)blend_color);
170592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe->set_sample_mask(pipe, sample_mask);
170692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
170792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned s = 0; s < 3; ++s)
170892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
170992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			unsigned num = std::min(caps.constant_buffers[s], (unsigned)D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT);
171092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			for(unsigned i = 0; i < num; ++i)
171192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				pipe->set_constant_buffer(pipe, s, i, constant_buffers[s][i].p ? constant_buffers[s][i].p->resource : 0);
171292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
171392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
171492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(caps.so)
171592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->set_stream_output_buffers(pipe, so_buffers, (int*)so_offsets, num_so_targets);
171692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
171792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_flags |= (1 << (UPDATE_SAMPLERS_SHIFT + D3D11_STAGE_VS)) | (1 << (UPDATE_VIEWS_SHIFT + D3D11_STAGE_VS));
171892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		update_flags |= (1 << (UPDATE_SAMPLERS_SHIFT + D3D11_STAGE_GS)) | (1 << (UPDATE_VIEWS_SHIFT + D3D11_STAGE_GS));
171992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
172092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		set_scissor();
172192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
172292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
172392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
172492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* TODO: hack SRVs or sampler states to handle this, or add to Gallium */
172592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE SetResourceMinLOD(
17263e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *iresource,
17273e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		float min_lod)
172892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
172992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
17303e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* resource = (GalliumD3D11Resource<>*)iresource;
17313e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		if(resource->min_lod != min_lod)
173292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
173392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			// TODO: actually do anything?
17343e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri			resource->min_lod = min_lod;
173592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
173692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
173792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
173892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual float STDMETHODCALLTYPE GetResourceMinLOD(
17393e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *iresource)
174092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
174192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
17423e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* resource = (GalliumD3D11Resource<>*)iresource;
174392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return resource->min_lod;
174492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
174592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
174692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
174792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE ResolveSubresource(
17483e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *dst_resource,
17493e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned dst_subresource,
17503e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11Resource *src_resource,
17513e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		unsigned src_subresource,
17523e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		DXGI_FORMAT format)
175392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
175492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
17553e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* dst = (GalliumD3D11Resource<>*)dst_resource;
17563e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		GalliumD3D11Resource<>* src = (GalliumD3D11Resource<>*)src_resource;
17574dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		struct pipe_resolve_info info;
17584dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller
17594dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.dst.res = dst->resource;
17604dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.src.res = src->resource;
17614dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.dst.level = 0;
17624dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.dst.layer = d3d11_subresource_to_face(dst->resource, dst_subresource);
17634dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.src.layer = d3d11_subresource_to_face(src->resource, src_subresource);
17644dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller
17654dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.src.x0 = 0;
17664dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.src.x1 = info.src.res->width0;
17674dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.src.y0 = 0;
17684dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.src.y1 = info.src.res->height0;
17694dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.dst.x0 = 0;
17704dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.dst.x1 = info.dst.res->width0;
17714dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.dst.y0 = 0;
17724dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.dst.y1 = info.dst.res->height0;
17734dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller
17744dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		info.mask = PIPE_MASK_RGBA | PIPE_MASK_ZS;
17754dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller
17764dd3272df9f6d483cb3734c3b8c77e9c190b3773Christoph Bumiller		pipe->resource_resolve(pipe, &info);
177792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
177892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
177992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
178092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE ExecuteCommandList(
17813e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11CommandList *command_list,
17823e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		BOOL restore_context_state)
178392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
178492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
178592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
178692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
178792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE FinishCommandList(
17883e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		BOOL restore_deferred_context_state,
17893e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri		ID3D11CommandList **out_command_list)
179092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
179192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
179292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return E_NOTIMPL;
179392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
179492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
179592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
179692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE ClearState(void)
179792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
179817ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		/* we don't take a lock here because we would deadlock otherwise
179917ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		 * TODO: this is probably incorrect, because ClearState should likely be atomic.
180017ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		 * However, I can't think of any correct usage that would be affected by this
180117ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		 * being non-atomic, and making this atomic is quite expensive and complicates
180217ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		 * the code
180317ad9972f4b998dbf1a046780b6bde461d721dd0Luca Barbieri		 */
180492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
180592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// we qualify all calls so that we avoid virtual dispatch and might get them inlined
180692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// TODO: make sure all this gets inlined, which might require more compiler flags
180792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// TODO: optimize this
180892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
180992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::PSSetShader(0, 0, 0);
181092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::GSSetShader(0, 0, 0);
181192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::VSSetShader(0, 0, 0);
181292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::HSSetShader(0, 0, 0);
181392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::DSSetShader(0, 0, 0);
181492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::CSSetShader(0, 0, 0);
181592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
181692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::PSSetShader(0);
181792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::GSSetShader(0);
181892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::VSSetShader(0);
181992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
182092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
182192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::IASetInputLayout(0);
182292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::IASetIndexBuffer(0, DXGI_FORMAT_UNKNOWN, 0);
182392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::RSSetState(0);
182492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::OMSetDepthStencilState(0, 0);
182592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::OMSetBlendState(0, (float*)zero_data, ~0);
182692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::SetPredication(0, 0);
182792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_UNDEFINED);
182892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
182992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::PSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, (ID3D11Buffer**)zero_data);
183092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::GSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, (ID3D11Buffer**)zero_data);
183192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::VSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, (ID3D11Buffer**)zero_data);
183292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
183392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::HSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, (ID3D11Buffer**)zero_data);
183492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::DSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, (ID3D11Buffer**)zero_data);
183592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::CSSetConstantBuffers(0, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT, (ID3D11Buffer**)zero_data);
183692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
183792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
183892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::IASetVertexBuffers(0, num_vertex_buffers, (ID3D11Buffer**)zero_data, (unsigned*)zero_data, (unsigned*)zero_data);
183992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
184092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::OMSetRenderTargetsAndUnorderedAccessViews(0, 0, 0 , 0, 0, 0, 0);
184192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
184292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::OMSetRenderTargets(0, 0, 0 );
184392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
184492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::SOSetTargets(0, 0, 0);
184592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
184692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::PSSetShaderResources(0, num_shader_resource_views[D3D11_STAGE_PS], (ID3D11ShaderResourceView**)zero_data);
184792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::GSSetShaderResources(0, num_shader_resource_views[D3D11_STAGE_GS], (ID3D11ShaderResourceView**)zero_data);
184892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::VSSetShaderResources(0, num_shader_resource_views[D3D11_STAGE_VS], (ID3D11ShaderResourceView**)zero_data);
184992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
185092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::HSSetShaderResources(0, num_shader_resource_views[D3D11_STAGE_HS], (ID3D11ShaderResourceView**)zero_data);
185192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::DSSetShaderResources(0, num_shader_resource_views[D3D11_STAGE_DS], (ID3D11ShaderResourceView**)zero_data);
185292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::CSSetShaderResources(0, num_shader_resource_views[D3D11_STAGE_CS], (ID3D11ShaderResourceView**)zero_data);
185392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
185492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
185592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::PSSetSamplers(0, num_shader_resource_views[D3D11_STAGE_PS], (ID3D11SamplerState**)zero_data);
185692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::GSSetSamplers(0, num_shader_resource_views[D3D11_STAGE_GS], (ID3D11SamplerState**)zero_data);
185792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::VSSetSamplers(0, num_shader_resource_views[D3D11_STAGE_VS], (ID3D11SamplerState**)zero_data);
185892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
185992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::HSSetSamplers(0, num_shader_resource_views[D3D11_STAGE_HS], (ID3D11SamplerState**)zero_data);
186092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::DSSetSamplers(0, num_shader_resource_views[D3D11_STAGE_DS], (ID3D11SamplerState**)zero_data);
186192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::CSSetSamplers(0, num_shader_resource_views[D3D11_STAGE_CS], (ID3D11SamplerState**)zero_data);
186292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
186392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
186492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::RSSetViewports(0, 0);
186592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumD3D11DeviceContext::RSSetScissorRects(0, 0);
186692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
186792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
186892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE Flush(void)
186992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
187092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
18717e02303497237cde958c28608477d0c355a8038bMarek Olšák                pipe->flush(pipe, 0);
187292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
187392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
187492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* In Direct3D 10, if the reference count of an object drops to 0, it is automatically
187592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * cleanly unbound from the pipeline.
187692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * In Direct3D 11, the pipeline holds a reference.
187792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 *
187892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * Note that instead of always scanning the pipeline on destruction, we could
187992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * maintain the internal reference count on DirectX 10 and use it to check if an
188092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * object is still bound.
188192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * Presumably, on average, scanning is faster if the application is well written.
188292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 */
188392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API < 11
188492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define IMPLEMENT_SIMPLE_UNBIND(name, member, gallium, def) \
188592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void Unbind##name(ID3D11##name* state) \
188692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{ \
188792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED; \
188892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if((void*)state == (void*)member.p) \
188992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{ \
189092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			member.p = 0; \
189192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->bind_##gallium##_state(pipe, default_##def); \
189292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		} \
189392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
189492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SIMPLE_UNBIND(BlendState, blend_state, blend, blend)
189592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SIMPLE_UNBIND(RasterizerState, rasterizer_state, rasterizer, rasterizer)
189692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SIMPLE_UNBIND(DepthStencilState, depth_stencil_state, depth_stencil_alpha, depth_stencil)
189792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SIMPLE_UNBIND(InputLayout, input_layout, vertex_elements, input_layout)
189892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SIMPLE_UNBIND(PixelShader, shaders[D3D11_STAGE_PS], fs, shaders[D3D11_STAGE_PS])
189992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SIMPLE_UNBIND(VertexShader, shaders[D3D11_STAGE_VS], vs, shaders[D3D11_STAGE_VS])
190092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	IMPLEMENT_SIMPLE_UNBIND(GeometryShader, shaders[D3D11_STAGE_GS], gs, shaders[D3D11_STAGE_GS])
190192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
190292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void UnbindPredicate(ID3D11Predicate* predicate)
190392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
190492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
190592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(predicate == render_predicate)
190692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
190792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			render_predicate.p = NULL;
190892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			render_predicate_value = 0;
190992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->render_condition(pipe, 0, 0);
191092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
191192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
191292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
191392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void UnbindSamplerState(ID3D11SamplerState* state)
191492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
191592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
191692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned s = 0; s < D3D11_STAGES; ++s)
191792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
191892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			for(unsigned i = 0; i < num_samplers[s]; ++i)
191992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
192092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(samplers[s][i] == state)
192192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
192292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					samplers[s][i].p = NULL;
192392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					sampler_csos[s].v[i] = NULL;
192492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					update_flags |= (1 << (UPDATE_SAMPLERS_SHIFT + s));
192592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
192692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
192792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
192892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
192992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
193092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void UnbindBuffer(ID3D11Buffer* buffer)
193192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
193292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
193392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(buffer == index_buffer)
193492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
193592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			index_buffer.p = 0;
193692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			index_format = DXGI_FORMAT_UNKNOWN;
193792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			index_offset = 0;
193892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			struct pipe_index_buffer ib;
193992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			memset(&ib, 0, sizeof(ib));
194092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			pipe->set_index_buffer(pipe, &ib);
194192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
194292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
194392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < num_vertex_buffers; ++i)
194492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
194592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(buffer == input_buffers[i])
194692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
194792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				input_buffers[i].p = 0;
194892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				memset(&vertex_buffers[num_vertex_buffers], 0, sizeof(vertex_buffers[num_vertex_buffers]));
194992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				update_flags |= UPDATE_VERTEX_BUFFERS;
195092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
195192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
195292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
195392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned s = 0; s < D3D11_STAGES; ++s)
195492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
195592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			for(unsigned i = 0; i < sizeof(constant_buffers) / sizeof(constant_buffers[0]); ++i)
195692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
195792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(constant_buffers[s][i] == buffer)
195892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
195992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					constant_buffers[s][i] = (ID3D10Buffer*)NULL;
196092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					pipe->set_constant_buffer(pipe, s, i, NULL);
196192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
196292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
196392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
196492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
196592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
19663e0f57b6401e7ddd0a5dc89b5b7fdd6c8d85818dLuca Barbieri	void UnbindDepthStencilView(ID3D11DepthStencilView * view)
196792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
196892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
196992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(view == depth_stencil_view)
197092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
197192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			depth_stencil_view.p = NULL;
197292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			set_framebuffer();
197392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
197492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
197592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
197692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void UnbindRenderTargetView(ID3D11RenderTargetView* view)
197792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
197892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
197992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		bool any_bound = false;
198092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < num_render_target_views; ++i)
198192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
198292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(render_target_views[i] == view)
198392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
198492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				render_target_views[i].p = NULL;
198592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				any_bound = true;
198692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
198792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
198892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(any_bound)
198992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			set_framebuffer();
199092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
199192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
199292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	void UnbindShaderResourceView(ID3D11ShaderResourceView* view)
199392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
199492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		SYNCHRONIZED;
199592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned s = 0; s < D3D11_STAGES; ++s)
199692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
199792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			for(unsigned i = 0; i < num_shader_resource_views[s]; ++i)
199892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
199992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(shader_resource_views[s][i] == view)
200092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				{
200192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					shader_resource_views[s][i].p = NULL;
200292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					sampler_views[s][i] = NULL;
200392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					update_flags |= (1 << (UPDATE_VIEWS_SHIFT + s));
200492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				}
200592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
200692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
200792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
200892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
200992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
201092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#undef SYNCHRONIZED
201192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
201292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
201392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
201492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/* This approach serves two purposes.
201592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * First, we don't want to do an atomic operation to manipulate the reference
201692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * count every time something is bound/unbound to the pipeline, since they are
201792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * expensive.
201892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Fortunately, the immediate context can only be used by a single thread, so
201992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * we don't have to use them, as long as a separate reference count is used
202092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * (see dual_refcnt_t).
202192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
202292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Second, we want to avoid the Device -> DeviceContext -> bound DeviceChild -> Device
202392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * garbage cycle.
202492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * To avoid it, DeviceChild doesn't hold a reference to Device as usual, but adds
202592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * one for each external reference count, while internal nonatomic_add_ref doesn't
202692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * add any.
202792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
202892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Note that ideally we would to eliminate the non-atomic op too, but this is more
202992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * complicated, since we would either need to use garbage collection and give up
203092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * deterministic destruction (especially bad for large textures), or scan the whole
203192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * pipeline state every time the reference count of object drops to 0, which risks
203292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * pathological slowdowns.
203392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
203492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Since this microoptimization should matter relatively little, let's avoid it for now.
203592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
203692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Note that deferred contexts don't use this, since as a whole, they must thread-safe.
203792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Eliminating the atomic ops for deferred contexts seems substantially harder.
203892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * This might be a problem if they are used in a one-shot multithreaded rendering
203992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * fashion, where SMP cacheline bouncing on the reference count may be visible.
204092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
204192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The idea would be to attach a structure of reference counts indexed by deferred
204292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * context id to each object. Ideally, this should be organized like ext2 block pointers.
204392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
204492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Every deferred context would get a reference count in its own cacheline.
204592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The external count is protected by a lock bit, and there is also a "lock bit" in each
204692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * internal count.
204792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
204892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * When the external count has to be dropped to 0, the lock bit is taken and all internal
204992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * reference counts are scanned, taking a count of them. A flag would also be set on them.
205092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Deferred context manipulation would notice the flag, and update the count.
205192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Once the count goes to zero, the object is freed.
205292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
205392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The problem of this is that if the external reference count ping-pongs between
205492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * zero and non-zero, the scans will take a lot of time.
205592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
205692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * The idea to solve this is to compute the scans in a binary-tree like fashion, where
205792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * each binary tree node would have a "determined bit", which would be invalidated
205892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * by manipulations.
205992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
206092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * However, all this complexity might actually be a loss in most cases, so let's just
206192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * stick to a single atomic refcnt for now.
206292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri *
206392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri * Also, we don't even support deferred contexts yet, so this can wait.
206492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri */
206592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct nonatomic_device_child_ptr_traits
206692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
206792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	static void add_ref(void* p)
206892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
206992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(p)
207092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			((GalliumD3D11DeviceChild<>*)p)->nonatomic_add_ref();
207192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
207292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
207392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	static void release(void* p)
207492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
207592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(p)
207692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			((GalliumD3D11DeviceChild<>*)p)->nonatomic_release();
207792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
207892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
207992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
208092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11ImmediateDeviceContext
208192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: public GalliumD3D11DeviceContext<nonatomic_device_child_ptr_traits>
208292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
208392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11ImmediateDeviceContext(GalliumD3D11Screen* device, pipe_context* pipe, unsigned context_flags = 0)
2084b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11DeviceContext<nonatomic_device_child_ptr_traits>(device, pipe, context_flags)
208592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
208692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// not necessary, but tests that the API at least basically works
208792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		ClearState();
208892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
208992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
209092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* we do this since otherwise we would have a garbage cycle between this and the device */
209192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ULONG STDMETHODCALLTYPE AddRef()
209292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
209392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return this->device->AddRef();
209492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
209592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
209692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ULONG STDMETHODCALLTYPE Release()
209792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
209892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return this->device->Release();
209992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
210092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
210192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual D3D11_DEVICE_CONTEXT_TYPE STDMETHODCALLTYPE GetType()
210292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
210392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return D3D11_DEVICE_CONTEXT_IMMEDIATE;
210492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
210592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
210692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
210792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristatic ID3D11DeviceContext* GalliumD3D11ImmediateDeviceContext_Create(GalliumD3D11Screen* device, struct pipe_context* pipe, bool owns_pipe)
210892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
210992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	return new GalliumD3D11ImmediateDeviceContext(device, pipe, owns_pipe);
211092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
211192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
211292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristatic void GalliumD3D11ImmediateDeviceContext_RestoreGalliumState(ID3D11DeviceContext* context)
211392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
211492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	((GalliumD3D11ImmediateDeviceContext*)context)->RestoreGalliumState();
211592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
211692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
211792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristatic void GalliumD3D11ImmediateDeviceContext_RestoreGalliumStateBlitOnly(ID3D11DeviceContext* context)
211892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
211992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	((GalliumD3D11ImmediateDeviceContext*)context)->RestoreGalliumStateBlitOnly();
212092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
212192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
212292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristatic void GalliumD3D11ImmediateDeviceContext_Destroy(ID3D11DeviceContext* context)
212392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
212492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	delete (GalliumD3D11ImmediateDeviceContext*)context;
212592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
212692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
2127