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