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 Barbieritemplate<typename Base = ID3D11DeviceChild>
2892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11DeviceChild : public GalliumPrivateDataComObject<Base, dual_refcnt_t>
2992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
3092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Screen* device; // must not be null
3192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
3292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
3392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	// if this is called, the subclass constructor must set device itself
3492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11DeviceChild()
3592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: device(0)
3692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
3792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
3892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11DeviceChild(GalliumD3D11Screen* p_device)
3992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
4092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		// we store the reference count minus one in refcnt
4192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device = p_device;
4292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device->AddRef();
4392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
4492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
45cb884262931644340507b3abdc12c3842d3e9897Christoph Bumiller	virtual ~GalliumD3D11DeviceChild()
46cb884262931644340507b3abdc12c3842d3e9897Christoph Bumiller	{
47cb884262931644340507b3abdc12c3842d3e9897Christoph Bumiller		if(device)
48cb884262931644340507b3abdc12c3842d3e9897Christoph Bumiller			device->Release();
49cb884262931644340507b3abdc12c3842d3e9897Christoph Bumiller	}
50cb884262931644340507b3abdc12c3842d3e9897Christoph Bumiller
5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* The purpose of this is to avoid cyclic garbage, since this won't hold
5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * a pointer to the device if it is only held by a pipeline binding in the immediate context
5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 *
5492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * TODO: we could only manipulate the device refcnt when atomic_refcnt == 0 changes,
5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * but this requires more complex atomic ops
5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 */
5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	inline ULONG add_ref()
5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return GalliumPrivateDataComObject<Base, dual_refcnt_t>::add_ref();
6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
6192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	inline ULONG release()
6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return GalliumPrivateDataComObject<Base, dual_refcnt_t>::release();
6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ULONG STDMETHODCALLTYPE AddRef()
6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
6992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return add_ref();
7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ULONG STDMETHODCALLTYPE Release()
7392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return release();
7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDevice(
789cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		ID3D11Device **out_device
796c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	 )
8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device->AddRef();
829cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_device = device;
8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11DeviceChild, typename Object = void>
8792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Object : public GalliumD3D11DeviceChild<Base>
8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
8992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	Object* object;
9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Object(GalliumD3D11Screen* device, Object* object)
9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11DeviceChild<Base>(device), object(object)
9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ~GalliumD3D11Object();
9592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define IMPLEMENT_OBJECT_DTOR(name, gallium) \
9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<> \
9992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriGalliumD3D11Object<ID3D11##name, void>::~GalliumD3D11Object() \
10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ \
10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	DX10_ONLY(device->Unbind##name(this)); \
10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	device->immediate_pipe->delete_##gallium##_state(device->immediate_pipe, object); \
10392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define IMPLEMENT_VIEW_DTOR(name, gallium) \
10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<> \
10792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriGalliumD3D11Object<ID3D11##name, struct pipe_##gallium>::~GalliumD3D11Object() \
10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ \
10992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	DX10_ONLY(device->Unbind##name(this)); \
11092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	pipe_##gallium##_reference(&object, 0); \
11192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
11292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(InputLayout, vertex_elements)
11492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(DepthStencilState, depth_stencil_alpha)
11592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(RasterizerState, rasterizer)
11692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(SamplerState, sampler)
11792617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(BlendState, blend)
11892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(VertexShader, vs)
11992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(PixelShader, fs)
12092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(GeometryShader, gs)
12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(ShaderResourceView, sampler_view)
12392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(RenderTargetView, surface)
12492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(DepthStencilView, surface)
12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_VIEW_DTOR(UnorderedAccessView, surface);
12892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_OBJECT_DTOR(HullShader, tcs);
12992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_OBJECT_DTOR(DomainShader, tes);
13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_OBJECT_DTOR(ComputeShader, cs);
13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
13292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(BlendState1, blend)
13392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(ShaderResourceView1, sampler_view)
13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base, typename Desc, typename Object = void>
13792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11DescribedObject : public GalliumD3D11Object<Base, Object>
13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	Desc desc;
14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11DescribedObject(GalliumD3D11Screen* device, Object* object, const Desc& desc)
14192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Object<Base, Object>(device, object), desc(desc)
14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
1449cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(Desc *out_desc)
14592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
1469cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		memcpy(out_desc, &desc, sizeof(desc));
14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
14892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
14992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
15092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Object<ID3D11InputLayout> GalliumD3D11InputLayout;
15192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC> GalliumD3D11DepthStencilState;
15292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11RasterizerState, D3D11_RASTERIZER_DESC> GalliumD3D11RasterizerStateBase;
15392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11SamplerState, D3D11_SAMPLER_DESC> GalliumD3D11SamplerState;
15492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
15592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
15692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11BlendState, D3D11_BLEND_DESC> GalliumD3D11BlendState;
15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D10DescribedObject<ID3D10BlendState1, D3D10_BLEND_DESC> GalliumD3D10BlendStateBase;
15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10BlendState : public GalliumD3D10BlendStateBase
16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	static D3D10_BLEND_DESC convert_to_d3d10(const D3D10_BLEND_DESC1& desc1)
16392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		D3D10_BLEND_DESC desc;
16592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.AlphaToCoverageEnable = desc1.AlphaToCoverageEnable;
16692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.SrcBlend = desc1.RenderTarget[0].SrcBlend;
16792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.DestBlend = desc1.RenderTarget[0].DestBlend;
16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.BlendOp = desc1.RenderTarget[0].BlendOp;
16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.SrcBlendAlpha = desc1.RenderTarget[0].SrcBlendAlpha;
17092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.DestBlendAlpha = desc1.RenderTarget[0].DestBlendAlpha;
17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.BlendOpAlpha = desc1.RenderTarget[0].BlendOpAlpha;
17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < 8; ++i)
17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc.BlendEnable[i] = desc1.RenderTarget[i].BlendEnable;
17592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc.RenderTargetWriteMask[i] = desc1.RenderTarget[i].RenderTargetWriteMask;
17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return desc;
17892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
17992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D10_BLEND_DESC1 desc1;
18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
18292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10BlendState(GalliumD3D10Screen* device, void* object, const D3D10_BLEND_DESC& desc)
18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10BlendStateBase(device, object, desc)
18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&desc1, 0, sizeof(desc1));
18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.AlphaToCoverageEnable = desc.AlphaToCoverageEnable;
18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].SrcBlend = desc.SrcBlend;
18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].DestBlend = desc.DestBlend;
18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].BlendOp = desc.BlendOp;
19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].SrcBlendAlpha = desc.SrcBlendAlpha;
19192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].DestBlendAlpha = desc.DestBlendAlpha;
19292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].BlendOpAlpha = desc.BlendOpAlpha;
19392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < 8; ++i)
19492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
19592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc1.RenderTarget[i].BlendEnable = desc.BlendEnable[i];
19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc1.RenderTarget[i].RenderTargetWriteMask = desc.RenderTargetWriteMask[i];
19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10BlendState(GalliumD3D10Screen* device, void* object, const D3D10_BLEND_DESC1& desc)
20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10BlendStateBase(device, object, convert_to_d3d10(desc)), desc1(desc1)
20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
2049cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual void STDMETHODCALLTYPE GetDesc1(D3D10_BLEND_DESC1 *out_desc)
20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
2069cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		memcpy(out_desc, &desc1, sizeof(desc1));
20792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
20992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
21092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11RasterizerState : public GalliumD3D11RasterizerStateBase
21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
213dc4c821f0817a3db716f965692fb701079f66340Marek Olšák	GalliumD3D11RasterizerState(GalliumD3D11Screen* device, void* object, const D3D11_RASTERIZER_DESC& desc)
214dc4c821f0817a3db716f965692fb701079f66340Marek Olšák	: GalliumD3D11RasterizerStateBase(device, object, desc)
21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11DeviceChild>
21992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Shader : public GalliumD3D11Object<Base>
22092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
22192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Shader(GalliumD3D11Screen* device, void* object)
22292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Object<Base>(device, object)
22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
22592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
22692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11VertexShader> GalliumD3D11VertexShader;
22792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11GeometryShader> GalliumD3D11GeometryShader;
22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11PixelShader> GalliumD3D11PixelShader;
22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
23192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/*
23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11HullShader> GalliumD3D11HullShader;
23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11DomainShader> GalliumD3D11DomainShader;
23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11ComputeShader> GalliumD3D11ComputeShader;
23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri*/
23692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
23792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
23892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Resource>
23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11ResourceBase : public GalliumD3D11DeviceChild<Base>
24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned eviction_priority;
24292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE SetEvictionPriority(
2449cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned new_eviction_priority
2459cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	)
24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
2479cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		eviction_priority = new_eviction_priority;
24892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
24992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
25092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual unsigned STDMETHODCALLTYPE GetEvictionPriority()
25192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
25292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return eviction_priority;
25392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
25492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
25592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
25692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Real>
25792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumDXGIResource : public IDXGIResource
25892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
25992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE SetEvictionPriority(
2609cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned new_eviction_priority
2619cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	)
26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
2639cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		static_cast<Real*>(this)->eviction_priority = new_eviction_priority;
26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
26592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
26692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
2679cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetEvictionPriority(unsigned* out_eviction_priority)
26892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
2699cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	 	*out_eviction_priority = static_cast<Real*>(this)->eviction_priority;
2709cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	 	return S_OK;
27192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
27292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDevice(
2748224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		REFIID riid,
2759cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		void **out_parent)
27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
27792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!static_cast<Real*>(this)->device)
27892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
2799cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		return static_cast<Real*>(this)->device->QueryInterface(riid, out_parent);
28092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
28192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
28292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetParent(
2838224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		REFIID riid,
2849cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		void **out_parent)
28592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
28692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!static_cast<Real*>(this)->device)
28792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
2889cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		return static_cast<Real*>(this)->device->QueryInterface(riid, out_parent);
28992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
29092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
29192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename T>
29392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct com_traits<GalliumDXGIResource<T> > : public com_traits<IDXGIResource>
29492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{};
29592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
29692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Resource>
29792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Resource
29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: public GalliumMultiComObject<
29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumMultiPrivateDataComObject<
30092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			GalliumD3D11ResourceBase<Base>,
30192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			GalliumDXGIResource<GalliumD3D11Resource<Base> >
30292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		>,
30392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		IGalliumResource
30492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	>
30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
30692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_resource* resource;
30792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::unordered_map<unsigned, pipe_transfer*> transfers;
30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	float min_lod;
30992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	DXGI_USAGE dxgi_usage;
31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Resource(GalliumD3D11Screen* device = 0, struct pipe_resource* resource = 0, unsigned dxgi_usage = 0)
31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: resource(resource), min_lod(0), dxgi_usage(dxgi_usage)
31392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device = device;
31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(device)
31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			device->AddRef();
31792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->eviction_priority = 0;
31892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
32092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11Resource()
32192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_resource_reference(&resource, 0);
32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetUsage(
3269cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		DXGI_USAGE *out_usage
3276c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	 )
32892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
3299cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_usage = this->dxgi_usage;
33092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
3339cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetSharedHandle(HANDLE *out_shared_handle)
33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
33592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return E_NOTIMPL;
33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
33892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual struct pipe_resource* STDMETHODCALLTYPE GetGalliumResource()
33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return resource;
34192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
34292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
34392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base, typename Desc, D3D11_RESOURCE_DIMENSION Dim>
34592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11TypedResource : public GalliumD3D11Resource<Base>
34692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
34792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	Desc desc;
34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11TypedResource() {}
34992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11TypedResource(GalliumD3D11Screen* device, struct pipe_resource* resource, const Desc& desc, unsigned dxgi_usage)
35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Resource<Base>(device, resource, dxgi_usage), desc(desc)
35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
35292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetType(
3539cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D11_RESOURCE_DIMENSION *out_resource_dimension)
35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
3559cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_resource_dimension = Dim;
35692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
3579cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(Desc *out_desc)
35892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
3599cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		memcpy(out_desc, &desc, sizeof(desc));
36092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
36192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
36292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
36392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Texture1D, D3D11_TEXTURE1D_DESC, D3D11_RESOURCE_DIMENSION_TEXTURE1D> GalliumD3D11Texture1DBase;
36492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Texture2D, D3D11_TEXTURE2D_DESC, D3D11_RESOURCE_DIMENSION_TEXTURE2D> GalliumD3D11Texture2DBase;
36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Texture3D, D3D11_TEXTURE3D_DESC, D3D11_RESOURCE_DIMENSION_TEXTURE3D> GalliumD3D11Texture3DBase;
36692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Buffer, D3D11_BUFFER_DESC, D3D11_RESOURCE_DIMENSION_BUFFER> GalliumD3D11BufferBase;
36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
36892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
36992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Texture1DBase GalliumD3D11Texture1D;
37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Texture2DBase GalliumD3D11Texture2D;
37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Texture3DBase GalliumD3D11Texture3D;
37214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
37314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumillerstruct GalliumD3D11Buffer : public GalliumD3D11BufferBase
37414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller{
37514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	struct pipe_stream_output_target* so_target;
37614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
37714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	GalliumD3D11Buffer(GalliumD3D11Screen* device, struct pipe_resource* resource, const D3D11_BUFFER_DESC& desc, unsigned dxgi_usage)
37814193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	: GalliumD3D11BufferBase(device, resource, desc, dxgi_usage), so_target(0)
37914193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	{
38014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	}
38114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
38214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	~GalliumD3D11Buffer()
38314193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	{
38414193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller		if(so_target)
38514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller			pipe_so_target_reference(&so_target, NULL);
38614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	}
38714193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller};
38892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Buffer : public GalliumD3D10BufferBase
39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
39114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	struct pipe_stream_output_target *so_target;
39214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Buffer(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_BUFFER_DESC& desc, unsigned dxgi_usage)
39492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10BufferBase(device, resource, desc, dxgi_usage)
39514193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	{
39614193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller	}
39792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D10Buffer()
39992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
40014193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller		if(so_target)
40114193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller			pipe_so_target_reference(&so_target, NULL);
40214193da589275969be31dbdb3280bb48cd24d0c0Christoph Bumiller
40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device->UnbindBuffer(this);
40492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
40592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
4066c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
4079cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D10_MAP map_type,
4089cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned map_flags,
4099cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		void **out_data)
4106c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
4116c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		D3D10_MAPPED_SUBRESOURCE msr;
4129cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		HRESULT hr = device->Map(this, 0, map_type, map_flags, &msr);
4136c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		if(!SUCCEEDED(hr))
4146c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri			return hr;
4159cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_data = msr.pData;
4166c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		return S_OK;
4176c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
4186c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri
4196c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	virtual void STDMETHODCALLTYPE Unmap()
4206c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
4216c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		device->Unmap(this, 0);
4226c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
42592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Texture1D : public GalliumD3D10Texture1DBase
42692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
42792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture1D(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_TEXTURE1D_DESC& desc, unsigned dxgi_usage)
42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10Texture1DBase(device, resource, desc, dxgi_usage)
42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
43092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
4329cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned subresource,
4339cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D10_MAP map_type,
4349cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned map_flags,
4359cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		void **out_data)
4366c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
4376c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		D3D10_MAPPED_SUBRESOURCE msr;
4389cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		HRESULT hr = device->Map(this, subresource, map_type, map_flags, &msr);
4396c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		if(!SUCCEEDED(hr))
4406c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri			return hr;
4419cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_data = msr.pData;
4426c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		return S_OK;
4436c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
4446c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri
4456c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	virtual void STDMETHODCALLTYPE Unmap(
4469cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned subresource
4476c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	)
4486c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
4499cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		device->Unmap(this, subresource);
4506c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
45192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
45292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
45392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Texture2D : public GalliumD3D10Texture2DBase
45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
45592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture2D() {}
45692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture2D(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_TEXTURE2D_DESC& desc, unsigned dxgi_usage)
45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10Texture2DBase(device, resource, desc, dxgi_usage)
45892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
45992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
46092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
4619cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned subresource,
4629cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D10_MAP map_type,
4639cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned map_flags,
4649cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D10_MAPPED_TEXTURE2D *out_mapped_subresource)
4656c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
4666c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		D3D10_MAPPED_SUBRESOURCE msr;
4679cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		HRESULT hr = device->Map(this, subresource, map_type, map_flags, &msr);
4686c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		if(!SUCCEEDED(hr))
4696c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri			return hr;
4709cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_mapped_subresource->pData = msr.pData;
4719cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_mapped_subresource->RowPitch = msr.RowPitch;
4726c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		return S_OK;
4736c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
4746c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri
4756c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	virtual void STDMETHODCALLTYPE Unmap(
4769cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned subresource
4776c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	)
4786c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
4799cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		device->Unmap(this, subresource);
4806c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
48192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
48292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Texture3D : public GalliumD3D10Texture3DBase
48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
48692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture3D(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_TEXTURE3D_DESC& desc, unsigned dxgi_usage)
48792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10Texture3DBase(device, resource, desc, dxgi_usage)
48892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
4919cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned subresource,
4929cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D10_MAP map_type,
4939cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned map_flags,
4949cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D10_MAPPED_TEXTURE3D *out_mapped_subresource)
4956c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
4966c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		D3D10_MAPPED_SUBRESOURCE msr;
4979cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		HRESULT hr = device->Map(this, subresource, map_type, map_flags, &msr);
4986c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		if(!SUCCEEDED(hr))
4996c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri			return hr;
5009cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_mapped_subresource->pData = msr.pData;
5019cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_mapped_subresource->RowPitch = msr.RowPitch;
5029cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_mapped_subresource->DepthPitch = msr.DepthPitch;
5036c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri		return S_OK;
5046c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
5056c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri
5066c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	virtual void STDMETHODCALLTYPE Unmap(
5079cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned subresource
5086c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	)
5096c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	{
5109cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		device->Unmap(this, subresource);
5116c598c78bd17642d731cf57b8369cc794f64ba2fLuca Barbieri	}
51292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
51592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Surface : public GalliumMultiPrivateDataComObject<GalliumD3D11Texture2D, IDXGISurface1>
51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Surface(GalliumD3D11Screen* device, struct pipe_resource* resource, const D3D11_TEXTURE2D_DESC& desc, unsigned dxgi_usage)
51892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device = device;
52092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->AddRef();
52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->resource = resource;
52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->desc = desc;
52392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->dxgi_usage = dxgi_usage;
52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
52592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
52692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDesc(
5279cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		DXGI_SURFACE_DESC *out_desc)
52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
5299cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_desc->Format = this->desc.Format;
5309cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_desc->Width = this->desc.Width;
5319cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_desc->Height = this->desc.Height;
5329cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_desc->SampleDesc = this->desc.SampleDesc;
53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
53492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetParent(
5378224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		REFIID riid,
5389cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		void **out_parent)
53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
54092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!device)
54192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
5429cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		return device->QueryInterface(riid, out_parent);
54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* TODO: somehow implement these */
54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDC(
5479cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		BOOL discard,
5489cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		HDC *out_hdc)
54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
5509cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_hdc = 0;
55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return E_NOTIMPL;
55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE ReleaseDC(
5559cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		RECT *out_dirty_rect)
55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return E_NOTIMPL;
55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
5619cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		DXGI_MAPPED_RECT *out_locked_rect,
5629cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned map_flags)
56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
56492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		D3D11_MAP d3d_map;
5659cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		if(map_flags & DXGI_MAP_DISCARD)
56692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			d3d_map = D3D11_MAP_WRITE_DISCARD;
56792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
5699cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri			if(map_flags & DXGI_MAP_READ)
57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
5719cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri				if(map_flags & DXGI_MAP_WRITE)
57292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					d3d_map = D3D11_MAP_READ_WRITE;
57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					d3d_map = D3D11_MAP_READ;
57592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
57692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			else
57792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				d3d_map = D3D11_MAP_WRITE;
57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		D3D11_MAPPED_SUBRESOURCE d3d_mapped;
58092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		HRESULT hres = this->device->get_immediate_context()->Map(this, 0, d3d_map, 0, &d3d_mapped);
5819cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_locked_rect->pBits = (uint8_t*)d3d_mapped.pData;
5829cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		out_locked_rect->Pitch = d3d_mapped.RowPitch;
58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return hres;
58492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
58592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
58692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Unmap(void)
58792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
58892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->get_immediate_context()->Unmap(this, 0);
58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
59292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDevice(
5938224256946619fb25278718bbf4703e3b9d60c93Luca Barbieri		REFIID riid,
5949cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		void **out_parent)
59592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
59692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!device)
59792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
5989cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		return device->QueryInterface(riid, out_parent);
59992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
60092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
60192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
60292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base, typename Desc, typename Object>
60392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11View : public GalliumD3D11DescribedObject<Base, Desc, Object>
60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
60592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Resource<>* resource;
60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11View(GalliumD3D11Screen* device, GalliumD3D11Resource<>* resource, Object* object, const Desc& desc)
60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11DescribedObject<Base, Desc, Object>(device, object, desc), resource(resource)
60892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
60992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		resource->AddRef();
61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
61292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11View()
61392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
61492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		resource->Release();
61592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
61692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6179cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual void STDMETHODCALLTYPE GetResource(ID3D11Resource** out_resource)
61892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
61992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		resource->AddRef();
6209cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_resource = resource;
62192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
62292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
62392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
62492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11View<ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, struct pipe_surface> GalliumD3D11DepthStencilView;
62592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11View<ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, struct pipe_surface> GalliumD3D11RenderTargetView;
62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
62892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11View<ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, struct pipe_sampler_view> GalliumD3D11ShaderResourceView;
62992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
63092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D10View<ID3D10ShaderResourceView1, D3D10_SHADER_RESOURCE_VIEW_DESC1, struct pipe_sampler_view> GalliumD3D10ShaderResourceViewBase;
63192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10ShaderResourceView : public GalliumD3D10ShaderResourceViewBase
63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
63492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10ShaderResourceView(GalliumD3D10Screen* device, GalliumD3D10Resource<>* resource, struct pipe_sampler_view* view, const D3D10_SHADER_RESOURCE_VIEW_DESC1& desc)
63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10ShaderResourceViewBase(device, resource, view, desc)
63692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
63792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6389cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual void STDMETHODCALLTYPE GetDesc1(D3D10_SHADER_RESOURCE_VIEW_DESC1 *out_desc)
63992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
6409cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		memcpy(out_desc, &desc, sizeof(*out_desc));
64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6439cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(D3D10_SHADER_RESOURCE_VIEW_DESC *out_desc)
64492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
6459cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		memcpy(out_desc, &desc, sizeof(*out_desc));
64692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
64792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
65092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Asynchronous>
65192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Asynchronous : public GalliumD3D11DeviceChild<Base>
65292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
65392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_query* query;
65492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned data_size;
65592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
65692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Asynchronous(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size)
65792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11DeviceChild<Base>(device), query(query), data_size(data_size)
65892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
65992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11Asynchronous()
66192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
66292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->immediate_pipe->destroy_query(this->device->immediate_pipe, query);
66392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
66492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
66592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual unsigned STDMETHODCALLTYPE GetDataSize()
66692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
66792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return data_size;
66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
66992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
67092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API < 11
67192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE Begin()
67292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
67392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->Begin(this);
67492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
67592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
67692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE End()
67792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
67892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->End(this);
67992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
68092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
68192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetData(
6829cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		void * out_data,
6839cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned data_size,
6849cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		unsigned get_data_flags)
68592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
6869cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		return this->device->GetData(this, out_data, data_size, get_data_flags);
68792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
68892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
68992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
69092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
69192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Asynchronous>
69292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11QueryOrPredicate : public GalliumD3D11Asynchronous<Base>
69392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
69492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D11_QUERY_DESC desc;
69592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11QueryOrPredicate(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_QUERY_DESC& desc)
69692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Asynchronous<Base>(device, query, data_size), desc(desc)
69792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
69892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
69992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(
7009cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D11_QUERY_DESC *out_desc)
70192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
7029cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_desc = desc;
70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
70492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
70692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Query : public GalliumD3D11QueryOrPredicate<ID3D11Query>
70792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
70892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Query(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_QUERY_DESC& desc)
709b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11QueryOrPredicate<ID3D11Query>(device, query, data_size, desc)
71092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
71192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
71292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Predicate : public GalliumD3D11QueryOrPredicate<ID3D11Predicate>
71492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
71592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Predicate(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_QUERY_DESC& desc)
716b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11QueryOrPredicate<ID3D11Predicate>(device, query, data_size, desc)
71792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
71892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
71992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11Predicate()
72092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
72192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		DX10_ONLY(device->UnbindPredicate(this));
72292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
72392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
72492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
72592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Counter : public GalliumD3D11Asynchronous<ID3D11Counter>
72692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
72792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D11_COUNTER_DESC desc;
72892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Counter(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_COUNTER_DESC& desc)
729b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11Asynchronous<ID3D11Counter>(device, query, data_size), desc(desc)
73092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
73192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
73292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(
7339cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		D3D11_COUNTER_DESC *out_desc)
73492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
7359cd0e624b460bc361287f7d39bfe9aa61d90a457Luca Barbieri		*out_desc = desc;
73692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
73792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
738