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