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