d3d11_objects.h revision b4b2091655676ec3b898d3ae7298192aa7f9147f
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
4592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* The purpose of this is to avoid cyclic garbage, since this won't hold
4692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * a pointer to the device if it is only held by a pipeline binding in the immediate context
4792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 *
4892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * TODO: we could only manipulate the device refcnt when atomic_refcnt == 0 changes,
4992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 * but this requires more complex atomic ops
5092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	 */
5192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	inline ULONG add_ref()
5292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
5392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device->AddRef();
5492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return GalliumPrivateDataComObject<Base, dual_refcnt_t>::add_ref();
5592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
5692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
5792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	inline ULONG release()
5892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
5992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device->Release();
6092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return GalliumPrivateDataComObject<Base, dual_refcnt_t>::release();
6192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
6292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ULONG STDMETHODCALLTYPE AddRef()
6492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
6592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return add_ref();
6692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
6792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
6892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ULONG STDMETHODCALLTYPE Release()
6992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
7092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return release();
7192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
7292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
7392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDevice(
7492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  ID3D11Device **ppDevice
7592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	   )
7692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
7792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device->AddRef();
7892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*ppDevice = device;
7992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
8092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
8192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
8292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11DeviceChild, typename Object = void>
8392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Object : public GalliumD3D11DeviceChild<Base>
8492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
8592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	Object* object;
8692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Object(GalliumD3D11Screen* device, Object* object)
8792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11DeviceChild<Base>(device), object(object)
8892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
8992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual ~GalliumD3D11Object();
9192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
9292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
9392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define IMPLEMENT_OBJECT_DTOR(name, gallium) \
9492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<> \
9592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriGalliumD3D11Object<ID3D11##name, void>::~GalliumD3D11Object() \
9692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ \
9792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	DX10_ONLY(device->Unbind##name(this)); \
9892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	device->immediate_pipe->delete_##gallium##_state(device->immediate_pipe, object); \
9992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
10092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#define IMPLEMENT_VIEW_DTOR(name, gallium) \
10292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<> \
10392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriGalliumD3D11Object<ID3D11##name, struct pipe_##gallium>::~GalliumD3D11Object() \
10492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{ \
10592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	DX10_ONLY(device->Unbind##name(this)); \
10692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	pipe_##gallium##_reference(&object, 0); \
10792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri}
10892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
10992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(InputLayout, vertex_elements)
11092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(DepthStencilState, depth_stencil_alpha)
11192617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(RasterizerState, rasterizer)
11292617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(SamplerState, sampler)
11392617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(BlendState, blend)
11492617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(VertexShader, vs)
11592617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(PixelShader, fs)
11692617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(GeometryShader, gs)
11792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
11892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(ShaderResourceView, sampler_view)
11992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(RenderTargetView, surface)
12092617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(DepthStencilView, surface)
12192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
12292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
12392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_VIEW_DTOR(UnorderedAccessView, surface);
12492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_OBJECT_DTOR(HullShader, tcs);
12592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_OBJECT_DTOR(DomainShader, tes);
12692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri// IMPLEMENT_OBJECT_DTOR(ComputeShader, cs);
12792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
12892617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_OBJECT_DTOR(BlendState1, blend)
12992617aeac109481258f0c3863d09c1b8903d438bLuca BarbieriIMPLEMENT_VIEW_DTOR(ShaderResourceView1, sampler_view)
13092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
13192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
13292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base, typename Desc, typename Object = void>
13392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11DescribedObject : public GalliumD3D11Object<Base, Object>
13492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
13592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	Desc desc;
13692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11DescribedObject(GalliumD3D11Screen* device, Object* object, const Desc& desc)
13792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Object<Base, Object>(device, object), desc(desc)
13892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
13992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(Desc *pDesc)
14192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
14292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memcpy(pDesc, &desc, sizeof(desc));
14392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
14492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
14592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
14692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Object<ID3D11InputLayout> GalliumD3D11InputLayout;
14792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11DepthStencilState, D3D11_DEPTH_STENCIL_DESC> GalliumD3D11DepthStencilState;
14892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11RasterizerState, D3D11_RASTERIZER_DESC> GalliumD3D11RasterizerStateBase;
14992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11SamplerState, D3D11_SAMPLER_DESC> GalliumD3D11SamplerState;
15092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
15192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
15292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11DescribedObject<ID3D11BlendState, D3D11_BLEND_DESC> GalliumD3D11BlendState;
15392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
15492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D10DescribedObject<ID3D10BlendState1, D3D10_BLEND_DESC> GalliumD3D10BlendStateBase;
15592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
15692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10BlendState : public GalliumD3D10BlendStateBase
15792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
15892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	static D3D10_BLEND_DESC convert_to_d3d10(const D3D10_BLEND_DESC1& desc1)
15992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
16092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		D3D10_BLEND_DESC desc;
16192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.AlphaToCoverageEnable = desc1.AlphaToCoverageEnable;
16292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.SrcBlend = desc1.RenderTarget[0].SrcBlend;
16392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.DestBlend = desc1.RenderTarget[0].DestBlend;
16492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.BlendOp = desc1.RenderTarget[0].BlendOp;
16592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.SrcBlendAlpha = desc1.RenderTarget[0].SrcBlendAlpha;
16692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.DestBlendAlpha = desc1.RenderTarget[0].DestBlendAlpha;
16792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc.BlendOpAlpha = desc1.RenderTarget[0].BlendOpAlpha;
16892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < 8; ++i)
16992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
17092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc.BlendEnable[i] = desc1.RenderTarget[i].BlendEnable;
17192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc.RenderTargetWriteMask[i] = desc1.RenderTarget[i].RenderTargetWriteMask;
17292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
17392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return desc;
17492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
17592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
17692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D10_BLEND_DESC1 desc1;
17792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
17892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10BlendState(GalliumD3D10Screen* device, void* object, const D3D10_BLEND_DESC& desc)
17992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10BlendStateBase(device, object, desc)
18092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
18192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memset(&desc1, 0, sizeof(desc1));
18292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.AlphaToCoverageEnable = desc.AlphaToCoverageEnable;
18392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].SrcBlend = desc.SrcBlend;
18492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].DestBlend = desc.DestBlend;
18592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].BlendOp = desc.BlendOp;
18692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].SrcBlendAlpha = desc.SrcBlendAlpha;
18792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].DestBlendAlpha = desc.DestBlendAlpha;
18892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		desc1.RenderTarget[0].BlendOpAlpha = desc.BlendOpAlpha;
18992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		for(unsigned i = 0; i < 8; ++i)
19092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
19192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc1.RenderTarget[i].BlendEnable = desc.BlendEnable[i];
19292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			desc1.RenderTarget[i].RenderTargetWriteMask = desc.RenderTargetWriteMask[i];
19392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
19492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
19592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
19692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10BlendState(GalliumD3D10Screen* device, void* object, const D3D10_BLEND_DESC1& desc)
19792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10BlendStateBase(device, object, convert_to_d3d10(desc)), desc1(desc1)
19892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
19992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
20092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc1(D3D10_BLEND_DESC1 *pDesc)
20192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
20292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memcpy(pDesc, &desc1, sizeof(desc1));
20392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
20492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
20592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
20692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
20792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11RasterizerState : public GalliumD3D11RasterizerStateBase
20892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
20992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	bool depth_clamp;
21092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11RasterizerState(GalliumD3D11Screen* device, void* object, const D3D11_RASTERIZER_DESC& desc, bool depth_clamp)
21292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11RasterizerStateBase(device, object, desc), depth_clamp(depth_clamp)
21392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
21492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
21592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
21692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11DeviceChild>
21792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Shader : public GalliumD3D11Object<Base>
21892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
21992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<int> slot_to_resource;
22092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::vector<int> slot_to_sampler;
22192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
22292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Shader(GalliumD3D11Screen* device, void* object)
22392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Object<Base>(device, object)
22492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
22592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
22692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
22792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11VertexShader> GalliumD3D11VertexShader;
22892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11GeometryShader> GalliumD3D11GeometryShader;
22992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11PixelShader> GalliumD3D11PixelShader;
23092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
23192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
23292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri/*
23392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11HullShader> GalliumD3D11HullShader;
23492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11DomainShader> GalliumD3D11DomainShader;
23592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Shader<ID3D11ComputeShader> GalliumD3D11ComputeShader;
23692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri*/
23792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
23892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
23992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Resource>
24092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11ResourceBase : public GalliumD3D11DeviceChild<Base>
24192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
24292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned eviction_priority;
24392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
24492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE SetEvictionPriority(
24592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned EvictionPriority)
24692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
24792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		eviction_priority = EvictionPriority;
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(
26092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned EvictionPriority)
26192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
26292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		static_cast<Real*>(this)->eviction_priority = EvictionPriority;
26392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
26492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
26592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
26692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetEvictionPriority(unsigned* pEvictionPriority)
26792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
26892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		   	*pEvictionPriority = static_cast<Real*>(this)->eviction_priority;
26992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		   	return S_OK;
27092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
27192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
27292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDevice(
27392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  REFIID riid,
27492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  void **ppParent)
27592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
27692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!static_cast<Real*>(this)->device)
27792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
27892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return static_cast<Real*>(this)->device->QueryInterface(riid, ppParent);
27992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
28092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
28192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetParent(
28292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  REFIID riid,
28392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  void **ppParent)
28492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
28592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!static_cast<Real*>(this)->device)
28692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
28792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return static_cast<Real*>(this)->device->QueryInterface(riid, ppParent);
28892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
28992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
29092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
29192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename T>
29292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct com_traits<GalliumDXGIResource<T> > : public com_traits<IDXGIResource>
29392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{};
29492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
29592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Resource>
29692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Resource
29792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: public GalliumMultiComObject<
29892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		GalliumMultiPrivateDataComObject<
29992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			GalliumD3D11ResourceBase<Base>,
30092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			GalliumDXGIResource<GalliumD3D11Resource<Base> >
30192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		>,
30292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		IGalliumResource
30392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	>
30492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
30592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_resource* resource;
30692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	std::unordered_map<unsigned, pipe_transfer*> transfers;
30792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	float min_lod;
30892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	DXGI_USAGE dxgi_usage;
30992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
31092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Resource(GalliumD3D11Screen* device = 0, struct pipe_resource* resource = 0, unsigned dxgi_usage = 0)
31192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: resource(resource), min_lod(0), dxgi_usage(dxgi_usage)
31292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
31392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device = device;
31492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(device)
31592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			device->AddRef();
31692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->eviction_priority = 0;
31792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
31892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
31992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11Resource()
32092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
32192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pipe_resource_reference(&resource, 0);
32292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
32392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
32492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetUsage(
32592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  DXGI_USAGE *pUsage
32692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	   )
32792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
32892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*pUsage = this->dxgi_usage;
32992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
33092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
33192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
33292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetSharedHandle(HANDLE *pSharedHandle)
33392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
33492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return E_NOTIMPL;
33592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
33692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
33792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual struct pipe_resource* STDMETHODCALLTYPE GetGalliumResource()
33892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
33992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return resource;
34092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
34192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
34292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
34392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base, typename Desc, D3D11_RESOURCE_DIMENSION Dim>
34492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11TypedResource : public GalliumD3D11Resource<Base>
34592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
34692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	Desc desc;
34792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11TypedResource() {}
34892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11TypedResource(GalliumD3D11Screen* device, struct pipe_resource* resource, const Desc& desc, unsigned dxgi_usage)
34992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Resource<Base>(device, resource, dxgi_usage), desc(desc)
35092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
35192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetType(
35292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  D3D11_RESOURCE_DIMENSION *pResourceDimension)
35392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
35492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*pResourceDimension = Dim;
35592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
35692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(Desc *pDesc)
35792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
35892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memcpy(pDesc, &desc, sizeof(desc));
35992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
36092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
36192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
36292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Texture1D, D3D11_TEXTURE1D_DESC, D3D11_RESOURCE_DIMENSION_TEXTURE1D> GalliumD3D11Texture1DBase;
36392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Texture2D, D3D11_TEXTURE2D_DESC, D3D11_RESOURCE_DIMENSION_TEXTURE2D> GalliumD3D11Texture2DBase;
36492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Texture3D, D3D11_TEXTURE3D_DESC, D3D11_RESOURCE_DIMENSION_TEXTURE3D> GalliumD3D11Texture3DBase;
36592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11TypedResource<ID3D11Buffer, D3D11_BUFFER_DESC, D3D11_RESOURCE_DIMENSION_BUFFER> GalliumD3D11BufferBase;
36692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
36792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
36892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11BufferBase GalliumD3D11Buffer;
36992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Texture1DBase GalliumD3D11Texture1D;
37092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Texture2DBase GalliumD3D11Texture2D;
37192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11Texture3DBase GalliumD3D11Texture3D;
37292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
37392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Buffer : public GalliumD3D10BufferBase
37492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
37592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Buffer(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_BUFFER_DESC& desc, unsigned dxgi_usage)
37692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10BufferBase(device, resource, desc, dxgi_usage)
37792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
37892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
37992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D10Buffer()
38092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
38192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		device->UnbindBuffer(this);
38292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
38392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
38492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        virtual HRESULT STDMETHODCALLTYPE Map(
38592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	__in  D3D10_MAP MapType,
38692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	__in  unsigned MapFlags,
38792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	__out  void **ppData)
38892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
38992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	D3D10_MAPPED_SUBRESOURCE msr;
39092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	HRESULT hr = device->Map(this, 0, MapType, MapFlags, &msr);
39192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	if(!SUCCEEDED(hr))
39292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        		return hr;
39392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	*ppData = msr.pData;
39492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	return S_OK;
39592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
39692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
39792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        virtual void STDMETHODCALLTYPE Unmap()
39892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
39992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	device->Unmap(this, 0);
40092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
40192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
40292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
40392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Texture1D : public GalliumD3D10Texture1DBase
40492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
40592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture1D(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_TEXTURE1D_DESC& desc, unsigned dxgi_usage)
40692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10Texture1DBase(device, resource, desc, dxgi_usage)
40792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
40892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
40992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
41092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned Subresource,
41192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  D3D10_MAP MapType,
41292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned MapFlags,
41392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  void **ppData)
41492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
41592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	D3D10_MAPPED_SUBRESOURCE msr;
41692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	HRESULT hr = device->Map(this, Subresource, MapType, MapFlags, &msr);
41792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	if(!SUCCEEDED(hr))
41892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        		return hr;
41992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	*ppData = msr.pData;
42092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	return S_OK;
42192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
42292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
42392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        virtual void STDMETHODCALLTYPE Unmap(
42492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	__in  unsigned Subresource
42592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        )
42692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
42792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	device->Unmap(this, Subresource);
42892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
42992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
43092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
43192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Texture2D : public GalliumD3D10Texture2DBase
43292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
43392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture2D() {}
43492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture2D(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_TEXTURE2D_DESC& desc, unsigned dxgi_usage)
43592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10Texture2DBase(device, resource, desc, dxgi_usage)
43692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
43792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
43892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
43992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned Subresource,
44092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  D3D10_MAP MapType,
44192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned MapFlags,
44292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  D3D10_MAPPED_TEXTURE2D *pMappedTex2D)
44392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
44492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	D3D10_MAPPED_SUBRESOURCE msr;
44592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	HRESULT hr = device->Map(this, Subresource, MapType, MapFlags, &msr);
44692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	if(!SUCCEEDED(hr))
44792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        		return hr;
44892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	pMappedTex2D->pData = msr.pData;
44992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	pMappedTex2D->RowPitch = msr.RowPitch;
45092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	return S_OK;
45192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
45292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
45392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        virtual void STDMETHODCALLTYPE Unmap(
45492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	__in  unsigned Subresource
45592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        )
45692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
45792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	device->Unmap(this, Subresource);
45892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
45992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
46092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
46192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
46292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10Texture3D : public GalliumD3D10Texture3DBase
46392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
46492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10Texture3D(GalliumD3D10Screen* device, struct pipe_resource* resource, const D3D10_TEXTURE3D_DESC& desc, unsigned dxgi_usage)
46592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10Texture3DBase(device, resource, desc, dxgi_usage)
46692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
46792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
46892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
46992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned Subresource,
47092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  D3D10_MAP MapType,
47192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  unsigned MapFlags,
47292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  D3D10_MAPPED_TEXTURE3D *pMappedTex3D)
47392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
47492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	D3D10_MAPPED_SUBRESOURCE msr;
47592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	HRESULT hr = device->Map(this, Subresource, MapType, MapFlags, &msr);
47692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	if(!SUCCEEDED(hr))
47792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        		return hr;
47892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	pMappedTex3D->pData = msr.pData;
47992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	pMappedTex3D->RowPitch = msr.RowPitch;
48092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	pMappedTex3D->DepthPitch = msr.DepthPitch;
48192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	return S_OK;
48292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
48392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
48492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        virtual void STDMETHODCALLTYPE Unmap(
48592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	__in  unsigned Subresource
48692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        )
48792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        {
48892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        	device->Unmap(this, Subresource);
48992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri        }
49092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
49192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
49292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
49392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Surface : public GalliumMultiPrivateDataComObject<GalliumD3D11Texture2D, IDXGISurface1>
49492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
49592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Surface(GalliumD3D11Screen* device, struct pipe_resource* resource, const D3D11_TEXTURE2D_DESC& desc, unsigned dxgi_usage)
49692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
49792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device = device;
49892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->AddRef();
49992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->resource = resource;
50092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->desc = desc;
50192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->dxgi_usage = dxgi_usage;
50292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
50392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
50492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDesc(
50592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  DXGI_SURFACE_DESC *pDesc)
50692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
50792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pDesc->Format = this->desc.Format;
50892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pDesc->Width = this->desc.Width;
50992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pDesc->Height = this->desc.Height;
51092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pDesc->SampleDesc = this->desc.SampleDesc;
51192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
51292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
51392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
51492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetParent(
51592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  REFIID riid,
51692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  void **ppParent)
51792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
51892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!device)
51992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
52092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return device->QueryInterface(riid, ppParent);
52192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
52292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
52392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	/* TODO: somehow implement these */
52492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDC(
52592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		BOOL Discard,
52692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  HDC *phdc)
52792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
52892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*phdc = 0;
52992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return E_NOTIMPL;
53092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
53192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
53292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE ReleaseDC(
53392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in_opt  RECT *pDirtyRect)
53492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
53592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return E_NOTIMPL;
53692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
53792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
53892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Map(
53992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  DXGI_MAPPED_RECT *pLockedRect,
54092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		unsigned MapFlags)
54192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
54292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		D3D11_MAP d3d_map;
54392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(MapFlags & DXGI_MAP_DISCARD)
54492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			d3d_map = D3D11_MAP_WRITE_DISCARD;
54592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		else
54692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		{
54792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			if(MapFlags & DXGI_MAP_READ)
54892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			{
54992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				if(MapFlags & DXGI_MAP_WRITE)
55092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					d3d_map = D3D11_MAP_READ_WRITE;
55192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				else
55292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri					d3d_map = D3D11_MAP_READ;
55392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			}
55492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			else
55592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri				d3d_map = D3D11_MAP_WRITE;
55692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		}
55792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		D3D11_MAPPED_SUBRESOURCE d3d_mapped;
55892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		HRESULT hres = this->device->get_immediate_context()->Map(this, 0, d3d_map, 0, &d3d_mapped);
55992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pLockedRect->pBits = (uint8_t*)d3d_mapped.pData;
56092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		pLockedRect->Pitch = d3d_mapped.RowPitch;
56192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return hres;
56292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
56392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
56492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE Unmap(void)
56592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
56692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->get_immediate_context()->Unmap(this, 0);
56792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return S_OK;
56892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
56992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
57092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetDevice(
57192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__in  REFIID riid,
57292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  void **ppParent)
57392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
57492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		if(!device)
57592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri			return E_NOINTERFACE;
57692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return device->QueryInterface(riid, ppParent);
57792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
57892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
57992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
58092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base, typename Desc, typename Object>
58192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11View : public GalliumD3D11DescribedObject<Base, Desc, Object>
58292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
58392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Resource<>* resource;
58492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11View(GalliumD3D11Screen* device, GalliumD3D11Resource<>* resource, Object* object, const Desc& desc)
58592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11DescribedObject<Base, Desc, Object>(device, object, desc), resource(resource)
58692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
58792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		resource->AddRef();
58892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
58992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
59092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11View()
59192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
59292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		resource->Release();
59392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
59492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
59592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetResource(ID3D11Resource** ppResource)
59692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
59792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		resource->AddRef();
59892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*ppResource = resource;
59992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
60092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
60192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
60292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11View<ID3D11DepthStencilView, D3D11_DEPTH_STENCIL_VIEW_DESC, struct pipe_surface> GalliumD3D11DepthStencilView;
60392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11View<ID3D11RenderTargetView, D3D11_RENDER_TARGET_VIEW_DESC, struct pipe_surface> GalliumD3D11RenderTargetView;
60492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
60592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API >= 11
60692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D11View<ID3D11ShaderResourceView, D3D11_SHADER_RESOURCE_VIEW_DESC, struct pipe_sampler_view> GalliumD3D11ShaderResourceView;
60792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#else
60892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritypedef GalliumD3D10View<ID3D10ShaderResourceView1, D3D10_SHADER_RESOURCE_VIEW_DESC1, struct pipe_sampler_view> GalliumD3D10ShaderResourceViewBase;
60992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
61092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D10ShaderResourceView : public GalliumD3D10ShaderResourceViewBase
61192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
61292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D10ShaderResourceView(GalliumD3D10Screen* device, GalliumD3D10Resource<>* resource, struct pipe_sampler_view* view, const D3D10_SHADER_RESOURCE_VIEW_DESC1& desc)
61392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D10ShaderResourceViewBase(device, resource, view, desc)
61492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
61592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
61692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc1(D3D10_SHADER_RESOURCE_VIEW_DESC1 *pDesc)
61792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
61892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memcpy(pDesc, &desc, sizeof(*pDesc));
61992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
62092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
62192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(D3D10_SHADER_RESOURCE_VIEW_DESC *pDesc)
62292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
62392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		memcpy(pDesc, &desc, sizeof(*pDesc));
62492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
62592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
62692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
62792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
62892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Asynchronous>
62992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Asynchronous : public GalliumD3D11DeviceChild<Base>
63092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
63192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	struct pipe_query* query;
63292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	unsigned data_size;
63392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
63492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Asynchronous(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size)
63592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11DeviceChild<Base>(device), query(query), data_size(data_size)
63692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
63792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
63892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11Asynchronous()
63992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
64092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->immediate_pipe->destroy_query(this->device->immediate_pipe, query);
64192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
64292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
64392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual unsigned STDMETHODCALLTYPE GetDataSize()
64492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
64592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return data_size;
64692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
64792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
64892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#if API < 11
64992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE Begin()
65092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
65192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->Begin(this);
65292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
65392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
65492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE End()
65592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
65692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		this->device->End(this);
65792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
65892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
65992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual HRESULT STDMETHODCALLTYPE GetData(
66092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out_bcount(DataSize)  void *pData,
66192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	        __in  unsigned DataSize,
66292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	        __in  unsigned GetDataFlags)
66392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
66492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		return this->device->GetData(this, pData, DataSize, GetDataFlags);
66592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
66692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri#endif
66792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
66892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
66992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieritemplate<typename Base = ID3D11Asynchronous>
67092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11QueryOrPredicate : public GalliumD3D11Asynchronous<Base>
67192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
67292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D11_QUERY_DESC desc;
67392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11QueryOrPredicate(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_QUERY_DESC& desc)
67492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	: GalliumD3D11Asynchronous<Base>(device, query, data_size), desc(desc)
67592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
67692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
67792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(
67892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  D3D11_QUERY_DESC *pDesc)
67992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
68092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*pDesc = desc;
68192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
68292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
68392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
68492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Query : public GalliumD3D11QueryOrPredicate<ID3D11Query>
68592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
68692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Query(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_QUERY_DESC& desc)
687b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11QueryOrPredicate<ID3D11Query>(device, query, data_size, desc)
68892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
68992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
69092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
69192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Predicate : public GalliumD3D11QueryOrPredicate<ID3D11Predicate>
69292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
69392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Predicate(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_QUERY_DESC& desc)
694b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11QueryOrPredicate<ID3D11Predicate>(device, query, data_size, desc)
69592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
69692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
69792617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	~GalliumD3D11Predicate()
69892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
69992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		DX10_ONLY(device->UnbindPredicate(this));
70092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
70192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
70292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
70392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieristruct GalliumD3D11Counter : public GalliumD3D11Asynchronous<ID3D11Counter>
70492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri{
70592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	D3D11_COUNTER_DESC desc;
70692617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	GalliumD3D11Counter(GalliumD3D11Screen* device, struct pipe_query* query, unsigned data_size, const D3D11_COUNTER_DESC& desc)
707b4b2091655676ec3b898d3ae7298192aa7f9147fLuca Barbieri	: GalliumD3D11Asynchronous<ID3D11Counter>(device, query, data_size), desc(desc)
70892617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{}
70992617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri
71092617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	virtual void STDMETHODCALLTYPE GetDesc(
71192617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		__out  D3D11_COUNTER_DESC *pDesc)
71292617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	{
71392617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri		*pDesc = desc;
71492617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri	}
71592617aeac109481258f0c3863d09c1b8903d438bLuca Barbieri};
716