1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2010 Luca Barbieri 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a copy of this software and associated documentation files (the 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sublicense, and/or sell copies of the Software, and to 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDEBUG_GET_ONCE_BOOL_OPTION(dump_shaders, "D3D1X_DUMP_SHADERS", FALSE); 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* These cap sets are much more correct than the ones in u_caps.c */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* TODO: it seems cube levels should be the same as 2D levels */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DX 9_1 */ 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_9_1[] = { 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_RENDER_TARGETS, 1), 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 12), /* 2048 */ 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 8), /* 256 */ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */ 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_TERMINATE 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DX 9_2 */ 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_9_2[] = { 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(OCCLUSION_QUERY), 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(TWO_SIDED_STENCIL), 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(TEXTURE_MIRROR_CLAMP), 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(BLEND_EQUATION_SEPARATE), 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_RENDER_TARGETS, 1), 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 12), /* 2048 */ 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 9), /* 256 */ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_TERMINATE 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* DX 9_3 */ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_9_3[] = { 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(OCCLUSION_QUERY), 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(TWO_SIDED_STENCIL), 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(TEXTURE_MIRROR_CLAMP), 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(BLEND_EQUATION_SEPARATE), 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(SM3), 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(VERTEX_ELEMENT_INSTANCE_DIVISOR), 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(OCCLUSION_QUERY), 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_RENDER_TARGETS, 4), 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 13), /* 4096 */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_3D_LEVELS, 9), /* 256 */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_CUBE_LEVELS, 10), /* 512 */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_TERMINATE 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned caps_dx_10_0[] = { 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(INDEP_BLEND_ENABLE), 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(ANISOTROPIC_FILTER), 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(MIXED_COLORBUFFER_FORMATS), 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(FRAGMENT_COLOR_CLAMP_CONTROL), 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(CONDITIONAL_RENDER), 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(PRIMITIVE_RESTART), 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_CAP(TGSI_INSTANCEID), 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_RENDER_TARGETS, 8), 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_2D_LEVELS, 13), 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_TEXTURE_ARRAY_LAYERS, 512), 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_INT(MAX_STREAM_OUTPUT_BUFFERS, 4), 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_SHADER(VERTEX, MAX_INPUTS, 16), 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_SHADER(GEOMETRY, MAX_CONST_BUFFERS, 14), 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_SHADER(GEOMETRY, MAX_TEXTURE_SAMPLERS, 16), 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_SHADER(GEOMETRY, SUBROUTINES, 1), 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_SHADER(FRAGMENT, INTEGERS, 1), 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_CHECK_TERMINATE 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// this is called "screen" because in the D3D10 case it's only part of the device 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate<bool threadsafe> 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct GalliumD3D11ScreenImpl : public GalliumD3D11Screen 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D_FEATURE_LEVEL feature_level; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int format_support[PIPE_FORMAT_COUNT]; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned creation_flags; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned exception_mode; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maybe_mutex_t<threadsafe> mutex; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* TODO: Direct3D 11 specifies that fine-grained locking should be used if the driver supports it. 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Right now, I don't trust Gallium drivers to get this right. 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SYNCHRONIZED lock_t<maybe_mutex_t<threadsafe> > lock_(mutex) 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11ScreenImpl(struct pipe_screen* screen, struct pipe_context* immediate_pipe, BOOL owns_immediate_pipe,unsigned creation_flags, IDXGIAdapter* adapter) 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : GalliumD3D11Screen(screen, immediate_pipe, adapter), creation_flags(creation_flags) 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&screen_caps, 0, sizeof(screen_caps)); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.gs = screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.so = screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) > 0; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.queries = screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.render_condition = screen->get_param(screen, PIPE_CAP_CONDITIONAL_RENDER); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < PIPE_SHADER_TYPES; ++i) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.constant_buffers[i] = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONST_BUFFERS); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.stages = 0; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < PIPE_SHADER_TYPES; ++i) 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_INSTRUCTIONS)) 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.stages = i + 1; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.stages_with_sampling = (1 << screen_caps.stages) - 1; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!screen->get_shader_param(screen, PIPE_SHADER_VERTEX, PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS)) 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen_caps.stages_with_sampling &=~ (1 << PIPE_SHADER_VERTEX); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(format_support, 0xff, sizeof(format_support)); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float default_level = 9.1f; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!util_check_caps(screen, caps_dx_9_1)) 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _debug_printf("Warning: driver does not even meet D3D_FEATURE_LEVEL_9_1 features, advertising it anyway!\n"); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(!util_check_caps(screen, caps_dx_9_2)) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default_level = 9.1f; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(!util_check_caps(screen, caps_dx_9_3)) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default_level = 9.2f; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(!util_check_caps(screen, caps_dx_10_0)) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default_level = 9.3f; 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default_level = 10.0f; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char default_level_name[64]; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sprintf(default_level_name, "%.1f", default_level); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float feature_level_number = atof(debug_get_option("D3D11_FEATURE_LEVEL", default_level_name)); 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!feature_level_number) 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org feature_level_number = default_level; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(feature_level_number >= 11.0f) 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org feature_level = D3D_FEATURE_LEVEL_11_0; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(feature_level_number >= 10.1f) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org feature_level = D3D_FEATURE_LEVEL_10_1; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(feature_level_number >= 10.0f) 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org feature_level = D3D_FEATURE_LEVEL_10_0; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(feature_level_number >= 9.3f) 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org feature_level = D3D_FEATURE_LEVEL_9_3; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(feature_level_number >= 9.2f) 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org feature_level = D3D_FEATURE_LEVEL_9_2; 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org feature_level = D3D_FEATURE_LEVEL_9_1; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immediate_context = GalliumD3D11ImmediateDeviceContext_Create(this, immediate_pipe, owns_immediate_pipe); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // release to the reference to ourselves that the immediate context took, to avoid a garbage cycle 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immediate_context->Release(); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~GalliumD3D11ScreenImpl() 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11ImmediateDeviceContext_Destroy(immediate_context); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual D3D_FEATURE_LEVEL STDMETHODCALLTYPE GetFeatureLevel(void) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return feature_level; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual unsigned STDMETHODCALLTYPE GetCreationFlags(void) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return creation_flags; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE GetDeviceRemovedReason(void) 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void STDMETHODCALLTYPE GetImmediateContext( 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11DeviceContext **out_immediate_context) 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immediate_context->AddRef(); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_immediate_context = immediate_context; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE SetExceptionMode(unsigned RaiseFlags) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exception_mode = RaiseFlags; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual unsigned STDMETHODCALLTYPE GetExceptionMode(void) 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return exception_mode; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CheckCounter( 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_COUNTER_DESC *desc, 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_COUNTER_TYPE *type, 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *active_counters, 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPSTR sz_name, 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *name_length, 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPSTR sz_units, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *units_length, 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LPSTR sz_description, 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *description_length) 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void STDMETHODCALLTYPE CheckCounterInfo( 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_COUNTER_INFO *counter_info) 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* none supported at the moment */ 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org counter_info->LastDeviceDependentCounter = (D3D11_COUNTER)0; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org counter_info->NumDetectableParallelUnits = 1; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org counter_info->NumSimultaneousCounters = 0; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CheckFeatureSupport( 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FEATURE feature, 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *out_feature_support_data, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned feature_support_data_size) 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(feature) 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_FEATURE_THREADING: 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FEATURE_DATA_THREADING* data = (D3D11_FEATURE_DATA_THREADING*)out_feature_support_data; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(feature_support_data_size != sizeof(*data)) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data->DriverCommandLists = FALSE; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data->DriverConcurrentCreates = FALSE; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_FEATURE_DOUBLES: 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FEATURE_DATA_DOUBLES* data = (D3D11_FEATURE_DATA_DOUBLES*)out_feature_support_data; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(feature_support_data_size != sizeof(*data)) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data->DoublePrecisionFloatShaderOps = FALSE; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_FEATURE_FORMAT_SUPPORT: 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FEATURE_DATA_FORMAT_SUPPORT* data = (D3D11_FEATURE_DATA_FORMAT_SUPPORT*)out_feature_support_data; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(feature_support_data_size != sizeof(*data)) 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return this->CheckFormatSupport(data->InFormat, &data->OutFormatSupport); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_FEATURE_FORMAT_SUPPORT2: 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FEATURE_DATA_FORMAT_SUPPORT* data = (D3D11_FEATURE_DATA_FORMAT_SUPPORT*)out_feature_support_data; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(feature_support_data_size != sizeof(*data)) 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data->OutFormatSupport = 0; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: should this be S_OK? */ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_FEATURE_D3D10_X_HARDWARE_OPTIONS: 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS* data = (D3D11_FEATURE_DATA_D3D10_X_HARDWARE_OPTIONS*)out_feature_support_data; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(feature_support_data_size != sizeof(*data)) 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data->ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x = FALSE; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CheckFormatSupport( 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_FORMAT dxgi_format, 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *out_format_support 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: MSAA, advanced features */ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_format format = dxgi_to_pipe_format[dxgi_format]; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!format) 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int support = format_support[format]; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(support < 0) 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support = 0; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dxgi_format == DXGI_FORMAT_R8_UINT || 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxgi_format == DXGI_FORMAT_R16_UINT || 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxgi_format == DXGI_FORMAT_R32_UINT) 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_IA_INDEX_BUFFER; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_BUFFER, 0, PIPE_BIND_VERTEX_BUFFER)) 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_IA_VERTEX_BUFFER; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_BUFFER, 0, PIPE_BIND_STREAM_OUTPUT)) 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_SO_BUFFER; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_1D, 0, PIPE_BIND_SAMPLER_VIEW)) 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_TEXTURE1D; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW)) 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_TEXTURE2D; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_CUBE, 0, PIPE_BIND_SAMPLER_VIEW)) 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_TEXTURECUBE; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_3D, 0, PIPE_BIND_SAMPLER_VIEW)) 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_TEXTURE3D; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(support & (D3D11_FORMAT_SUPPORT_TEXTURE1D | D3D11_FORMAT_SUPPORT_TEXTURE2D | 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FORMAT_SUPPORT_TEXTURE3D | D3D11_FORMAT_SUPPORT_TEXTURECUBE)) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FORMAT_SUPPORT_SHADER_LOAD | 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FORMAT_SUPPORT_SHADER_SAMPLE | 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FORMAT_SUPPORT_MIP | 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_FORMAT_SUPPORT_MIP_AUTOGEN; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(util_format_is_depth_or_stencil(format)) 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_SHADER_SAMPLE_COMPARISON; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET | PIPE_BIND_BLENDABLE)) 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_BLENDABLE; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_RENDER_TARGET)) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_RENDER_TARGET; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_DEPTH_STENCIL)) 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_DEPTH_STENCIL; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, PIPE_BIND_DISPLAY_TARGET)) 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_DISPLAY; 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned ms; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(ms = 2; ms <= 8; ++ms) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, ms, PIPE_BIND_RENDER_TARGET)) 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(ms <= 8 && screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, ms, PIPE_BIND_SAMPLER_VIEW)) 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org support |= D3D11_FORMAT_SUPPORT_MULTISAMPLE_LOAD; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format_support[format] = support; 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_format_support = support; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CheckMultisampleQualityLevels( 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_FORMAT format, 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sample_count, 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *pcount 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(sample_count == 1) 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcount = 1; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pcount = 0; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org template<typename T, typename U> 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool convert_blend_state(T& to, const U& from, unsigned BlendEnable, unsigned RenderTargetWriteMask) 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(unlikely(BlendEnable && 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (from.SrcBlend >= D3D11_BLEND_COUNT || 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org from.SrcBlendAlpha >= D3D11_BLEND_COUNT || 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org from.DestBlend >= D3D11_BLEND_COUNT || 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org from.DestBlendAlpha >= D3D11_BLEND_COUNT || 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org from.BlendOp >= 6 || 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org from.BlendOp == 0 || 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org from.BlendOpAlpha >= 6 || 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org from.BlendOpAlpha == 0))) 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.blend_enable = BlendEnable; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(BlendEnable) 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.rgb_func = from.BlendOp - 1; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.alpha_func = from.BlendOpAlpha - 1; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.rgb_src_factor = d3d11_to_pipe_blend[from.SrcBlend]; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.alpha_src_factor = d3d11_to_pipe_blend[from.SrcBlendAlpha]; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.rgb_dst_factor = d3d11_to_pipe_blend[from.DestBlend]; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.alpha_dst_factor = d3d11_to_pipe_blend[from.DestBlendAlpha]; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org to.colormask = RenderTargetWriteMask & 0xf; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateBlendState( 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_BLEND_DESC *blend_state_desc, 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11BlendState **out_blend_state 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateBlendState1( 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D10_BLEND_DESC1 *blend_state_desc, 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D10BlendState1 **out_blend_state 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_blend_state state; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&state, 0, sizeof(state)); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.alpha_to_coverage = !!blend_state_desc->AlphaToCoverageEnable; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.independent_blend_enable = !!blend_state_desc->IndependentBlendEnable; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(PIPE_MAX_COLOR_BUFS >= 8); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned n = blend_state_desc->IndependentBlendEnable ? 8 : 1; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < n; ++i) 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!convert_blend_state( 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.rt[i], 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_state_desc->RenderTarget[i], 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_state_desc->RenderTarget[i].BlendEnable, 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_state_desc->RenderTarget[i].RenderTargetWriteMask)) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_blend_state) 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* object = immediate_pipe->create_blend_state(immediate_pipe, &state); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!object) 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_blend_state = new GalliumD3D11BlendState(this, object, *blend_state_desc); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API < 11 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateBlendState( 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D10_BLEND_DESC *blend_state_desc, 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D10BlendState **out_blend_state 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_blend_state state; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&state, 0, sizeof(state)); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.alpha_to_coverage = !!blend_state_desc->AlphaToCoverageEnable; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(PIPE_MAX_COLOR_BUFS >= 8); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < 8; ++i) 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!convert_blend_state( 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.rt[i], 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *blend_state_desc, 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_state_desc->BlendEnable[i], 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org blend_state_desc->RenderTargetWriteMask[i])) 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 1; i < 8; ++i) 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(memcmp(&state.rt[0], &state.rt[i], sizeof(state.rt[0]))) 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.independent_blend_enable = TRUE; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* object = immediate_pipe->create_blend_state(immediate_pipe, &state); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!object) 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_blend_state = new GalliumD3D11BlendState(this, object, *blend_state_desc); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateDepthStencilState( 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_DEPTH_STENCIL_DESC *depth_stencil_state_desc, 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11DepthStencilState **depth_stencil_state 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_depth_stencil_alpha_state state; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&state, 0, sizeof(state)); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.depth.enabled = !!depth_stencil_state_desc->DepthEnable; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(depth_stencil_state_desc->DepthEnable) 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(depth_stencil_state_desc->DepthFunc == 0 || 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil_state_desc->DepthFunc >= 9) 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.depth.writemask = depth_stencil_state_desc->DepthWriteMask; 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.depth.func = depth_stencil_state_desc->DepthFunc - 1; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[0].enabled = !!depth_stencil_state_desc->StencilEnable; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(depth_stencil_state_desc->StencilEnable) 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(depth_stencil_state_desc->FrontFace.StencilPassOp >= D3D11_STENCIL_OP_COUNT || 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil_state_desc->FrontFace.StencilFailOp >= D3D11_STENCIL_OP_COUNT || 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil_state_desc->FrontFace.StencilDepthFailOp >= D3D11_STENCIL_OP_COUNT || 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil_state_desc->BackFace.StencilPassOp >= D3D11_STENCIL_OP_COUNT || 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil_state_desc->BackFace.StencilFailOp >= D3D11_STENCIL_OP_COUNT || 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth_stencil_state_desc->BackFace.StencilDepthFailOp >= D3D11_STENCIL_OP_COUNT) 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[0].writemask = depth_stencil_state_desc->StencilWriteMask; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[0].valuemask = depth_stencil_state_desc->StencilReadMask; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[0].zpass_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->FrontFace.StencilPassOp]; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[0].fail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->FrontFace.StencilFailOp]; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[0].zfail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->FrontFace.StencilDepthFailOp]; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[0].func = depth_stencil_state_desc->FrontFace.StencilFunc - 1; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[1].enabled = !!depth_stencil_state_desc->StencilEnable; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[1].writemask = depth_stencil_state_desc->StencilWriteMask; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[1].valuemask = depth_stencil_state_desc->StencilReadMask; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[1].zpass_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->BackFace.StencilPassOp]; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[1].fail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->BackFace.StencilFailOp]; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[1].zfail_op = d3d11_to_pipe_stencil_op[depth_stencil_state_desc->BackFace.StencilDepthFailOp]; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.stencil[1].func = depth_stencil_state_desc->BackFace.StencilFunc - 1; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!depth_stencil_state) 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* object = immediate_pipe->create_depth_stencil_alpha_state(immediate_pipe, &state); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!object) 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *depth_stencil_state = new GalliumD3D11DepthStencilState(this, object, *depth_stencil_state_desc); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateRasterizerState( 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_RASTERIZER_DESC *rasterizer_desc, 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11RasterizerState **out_rasterizer_state) 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_rasterizer_state state; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&state, 0, sizeof(state)); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.gl_rasterization_rules = 1; /* D3D10/11 use GL rules */ 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.fill_front = state.fill_back = (rasterizer_desc->FillMode == D3D11_FILL_WIREFRAME) ? PIPE_POLYGON_MODE_LINE : PIPE_POLYGON_MODE_FILL; 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(rasterizer_desc->CullMode == D3D11_CULL_FRONT) 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.cull_face = PIPE_FACE_FRONT; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(rasterizer_desc->CullMode == D3D11_CULL_BACK) 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.cull_face = PIPE_FACE_BACK; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.cull_face = PIPE_FACE_NONE; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.front_ccw = !!rasterizer_desc->FrontCounterClockwise; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.offset_tri = state.offset_line = state.offset_point = rasterizer_desc->SlopeScaledDepthBias || rasterizer_desc->DepthBias; 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.offset_scale = rasterizer_desc->SlopeScaledDepthBias; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.offset_units = rasterizer_desc->DepthBias; 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.offset_clamp = rasterizer_desc->DepthBiasClamp; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.depth_clip = rasterizer_desc->DepthClipEnable; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.scissor = !!rasterizer_desc->ScissorEnable; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.multisample = !!rasterizer_desc->MultisampleEnable; 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.line_smooth = !!rasterizer_desc->AntialiasedLineEnable; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.flatshade_first = 1; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.line_width = 1.0f; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.point_size = 1.0f; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: is this correct? */ 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.point_quad_rasterization = 1; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_rasterizer_state) 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* object = immediate_pipe->create_rasterizer_state(immediate_pipe, &state); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!object) 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_rasterizer_state = new GalliumD3D11RasterizerState(this, object, *rasterizer_desc); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateSamplerState( 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SAMPLER_DESC *sampler_desc, 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11SamplerState **out_sampler_state) 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_state state; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&state, 0, sizeof(state)); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.normalized_coords = 1; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.min_mip_filter = (sampler_desc->Filter & 1); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.mag_img_filter = ((sampler_desc->Filter >> 2) & 1); 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.min_img_filter = ((sampler_desc->Filter >> 4) & 1); 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(sampler_desc->Filter & 0x40) 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.max_anisotropy = sampler_desc->MaxAnisotropy; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(sampler_desc->Filter & 0x80) 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.compare_mode = PIPE_TEX_COMPARE_R_TO_TEXTURE; 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.compare_func = sampler_desc->ComparisonFunc - 1; 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.wrap_s = d3d11_to_pipe_wrap[sampler_desc->AddressU]; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.wrap_t = d3d11_to_pipe_wrap[sampler_desc->AddressV]; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.wrap_r = d3d11_to_pipe_wrap[sampler_desc->AddressW]; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.lod_bias = sampler_desc->MipLODBias; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(state.border_color.f, sampler_desc->BorderColor, sizeof(state.border_color)); 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.min_lod = sampler_desc->MinLOD; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.max_lod = sampler_desc->MaxLOD; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_sampler_state) 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* object = immediate_pipe->create_sampler_state(immediate_pipe, &state); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!object) 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_sampler_state = new GalliumD3D11SamplerState(this, object, *sampler_desc); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateInputLayout( 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_INPUT_ELEMENT_DESC *input_element_descs, 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *shader_bytecode_with_input_signature, 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SIZE_T bytecode_length, 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11InputLayout **out_input_layout) 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(count > D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT) 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT <= PIPE_MAX_ATTRIBS); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // putting semantics matching in the core API seems to be a (minor) design mistake 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode_with_input_signature, bytecode_length, DXBC_FIND_INPUT_SIGNATURE); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_SIGNATURE_PARAMETER_DESC* params; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_params = dxbc_parse_signature(sig, ¶ms); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org typedef std::unordered_map<std::pair<c_string, unsigned>, unsigned> semantic_to_idx_map_t; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org semantic_to_idx_map_t semantic_to_idx_map; 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < count; ++i) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org semantic_to_idx_map[std::make_pair(c_string(input_element_descs[i].SemanticName), input_element_descs[i].SemanticIndex)] = i; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_vertex_element elements[D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT]; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format formats[D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT]; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned offsets[D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT]; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offsets[0] = 0; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < count; ++i) 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org formats[i] = dxgi_to_pipe_format[input_element_descs[i].Format]; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(likely(input_element_descs[i].AlignedByteOffset != D3D11_APPEND_ALIGNED_ELEMENT)) 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offsets[i] = input_element_descs[i].AlignedByteOffset; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(i > 0) 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned align_mask = util_format_description(formats[i])->channel[0].size; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(align_mask & 7) // e.g. R10G10B10A2 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org align_mask = 32; 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org align_mask = (align_mask / 8) - 1; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offsets[i] = (offsets[i - 1] + util_format_get_blocksize(formats[i - 1]) + align_mask) & ~align_mask; 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // TODO: check for & report errors (e.g. ambiguous layouts, unmatched semantics) 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_params_to_use = 0; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < num_params && num_params_to_use < D3D11_IA_VERTEX_INPUT_STRUCTURE_ELEMENT_COUNT; ++i) 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!strcasecmp(params[i].SemanticName, "SV_INSTANCEID") || 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !strcasecmp(params[i].SemanticName, "SV_VERTEXID")) 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned n = num_params_to_use++; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org semantic_to_idx_map_t::iterator iter = semantic_to_idx_map.find(std::make_pair(c_string(params[i].SemanticName), params[i].SemanticIndex)); 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(iter != semantic_to_idx_map.end()) 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned idx = iter->second; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].src_format = formats[idx]; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].src_offset = offsets[idx]; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].vertex_buffer_index = input_element_descs[idx].InputSlot; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].instance_divisor = input_element_descs[idx].InstanceDataStepRate; 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (input_element_descs[idx].InputSlotClass == D3D11_INPUT_PER_INSTANCE_DATA) 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (elements[n].instance_divisor == 0) 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].instance_divisor = ~0; // XXX: can't specify 'never' to gallium 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // XXX: undefined input, is this valid or should we return an error ? 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].src_format = PIPE_FORMAT_NONE; 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].src_offset = 0; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].vertex_buffer_index = 0; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elements[n].instance_divisor = 0; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(params); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_input_layout) 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* object = immediate_pipe->create_vertex_elements_state(immediate_pipe, num_params_to_use, elements); 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!object) 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_input_layout = new GalliumD3D11InputLayout(this, object); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static unsigned d3d11_to_pipe_bind_flags(unsigned bind_flags) 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bind = 0; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_VERTEX_BUFFER) 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_VERTEX_BUFFER; 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_INDEX_BUFFER) 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_INDEX_BUFFER; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_CONSTANT_BUFFER) 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_CONSTANT_BUFFER; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_SHADER_RESOURCE) 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_SAMPLER_VIEW; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_STREAM_OUTPUT) 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_STREAM_OUTPUT; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_RENDER_TARGET) 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_RENDER_TARGET; 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_DEPTH_STENCIL) 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bind |= PIPE_BIND_DEPTH_STENCIL; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bind; 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline HRESULT create_resource( 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_texture_target target, 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned height, 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth, 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mip_levels, 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned array_size, 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_FORMAT format, 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const DXGI_SAMPLE_DESC* SampleDesc, 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_USAGE usage, 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bind_flags, 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned c_p_u_access_flags, 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned misc_flags, 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SUBRESOURCE_DATA *initial_data, 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_USAGE dxgi_usage, 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource** ppresource 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(invalid(format >= DXGI_FORMAT_COUNT)) 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(misc_flags & D3D11_RESOURCE_MISC_TEXTURECUBE) 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(target != PIPE_TEXTURE_2D) 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = PIPE_TEXTURE_CUBE; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(array_size % 6) 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if(array_size > 1) 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: target = PIPE_TEXTURE_1D_ARRAY; break; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: target = PIPE_TEXTURE_2D_ARRAY; break; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: msaa */ 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templat; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templat, 0, sizeof(templat)); 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.target = target; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.width0 = width; 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.height0 = height; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.depth0 = depth; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.array_size = array_size; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(mip_levels) 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.last_level = mip_levels - 1; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.last_level = MAX2(MAX2(util_logbase2(templat.width0), util_logbase2(templat.height0)), util_logbase2(templat.depth0)); 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.format = dxgi_to_pipe_format[format]; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind_flags & D3D11_BIND_DEPTH_STENCIL) { 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // colour formats are not depth-renderable, but depth/stencil-formats may be colour-renderable 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(format) 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DXGI_FORMAT_R32_TYPELESS: templat.format = PIPE_FORMAT_Z32_FLOAT; break; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DXGI_FORMAT_R16_TYPELESS: templat.format = PIPE_FORMAT_Z16_UNORM; break; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind = d3d11_to_pipe_bind_flags(bind_flags); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(c_p_u_access_flags & D3D11_CPU_ACCESS_READ) 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_TRANSFER_READ; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(c_p_u_access_flags & D3D11_CPU_ACCESS_WRITE) 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_TRANSFER_WRITE; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(misc_flags & D3D11_RESOURCE_MISC_SHARED) 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_SHARED; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(misc_flags & D3D11_RESOURCE_MISC_GDI_COMPATIBLE) 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_TRANSFER_READ | PIPE_BIND_TRANSFER_WRITE; 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dxgi_usage & DXGI_USAGE_BACK_BUFFER) 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_DISPLAY_TARGET; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.usage = d3d11_to_pipe_usage[usage]; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(invalid(!templat.format)) 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!ppresource) 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* resource = screen->resource_create(screen, &templat); 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!resource) 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(initial_data) 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned slice = 0; slice < array_size; ++slice) 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned level = 0; level <= templat.last_level; ++level) 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_box box; 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.x = box.y = 0; 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.z = slice; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.width = u_minify(width, level); 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.height = u_minify(height, level); 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org box.depth = u_minify(depth, level); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immediate_pipe->transfer_inline_write(immediate_pipe, resource, level, PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD | PIPE_TRANSFER_UNSYNCHRONIZED, &box, initial_data->pSysMem, initial_data->SysMemPitch, initial_data->SysMemSlicePitch); 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++initial_data; 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *ppresource = resource; 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static unsigned d3d_to_dxgi_usage(unsigned bind, unsigned misc) 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dxgi_usage = 0; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind |= D3D11_BIND_RENDER_TARGET) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxgi_usage |= DXGI_USAGE_RENDER_TARGET_OUTPUT; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind & D3D11_BIND_SHADER_RESOURCE) 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxgi_usage |= DXGI_USAGE_SHADER_INPUT; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(bind & D3D11_BIND_UNORDERED_ACCESS) 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxgi_usage |= DXGI_USAGE_UNORDERED_ACCESS; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(misc & D3D11_RESOURCE_MISC_SHARED) 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxgi_usage |= DXGI_USAGE_SHARED; 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dxgi_usage; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateTexture1D( 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_TEXTURE1D_DESC *desc, 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SUBRESOURCE_DATA *initial_data, 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Texture1D **out_texture1d) 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* resource; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags); 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HRESULT hr = create_resource(PIPE_TEXTURE_1D, desc->Width, 1, 1, desc->MipLevels, desc->ArraySize, desc->Format, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture1d ? &resource : 0); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(hr != S_OK) 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return hr; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_TEXTURE1D_DESC cdesc = *desc; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cdesc.MipLevels = resource->last_level + 1; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_texture1d = new GalliumD3D11Texture1D(this, resource, cdesc, dxgi_usage); 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateTexture2D( 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_TEXTURE2D_DESC *desc, 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SUBRESOURCE_DATA *initial_data, 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Texture2D **out_texture2d) 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* resource; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HRESULT hr = create_resource(PIPE_TEXTURE_2D, desc->Width, desc->Height, 1, desc->MipLevels, desc->ArraySize, desc->Format, &desc->SampleDesc, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture2d ? &resource : 0); 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(hr != S_OK) 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return hr; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_TEXTURE2D_DESC cdesc = *desc; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cdesc.MipLevels = resource->last_level + 1; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(cdesc.MipLevels == 1 && cdesc.ArraySize == 1) 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_texture2d = new GalliumD3D11Surface(this, resource, cdesc, dxgi_usage); 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_texture2d = new GalliumD3D11Texture2D(this, resource, cdesc, dxgi_usage); 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateTexture3D( 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_TEXTURE3D_DESC *desc, 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SUBRESOURCE_DATA *initial_data, 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Texture3D **out_texture3d) 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* resource; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags); 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HRESULT hr = create_resource(PIPE_TEXTURE_3D, desc->Width, desc->Height, desc->Depth, desc->MipLevels, 1, desc->Format, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_texture3d ? &resource : 0); 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(hr != S_OK) 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return hr; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_TEXTURE3D_DESC cdesc = *desc; 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cdesc.MipLevels = resource->last_level + 1; 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_texture3d = new GalliumD3D11Texture3D(this, resource, cdesc, dxgi_usage); 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateBuffer( 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_BUFFER_DESC *desc, 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SUBRESOURCE_DATA *initial_data, 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Buffer **out_buffer) 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* resource; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc->BindFlags, desc->MiscFlags); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HRESULT hr = create_resource(PIPE_BUFFER, desc->ByteWidth, 1, 1, 1, 1, DXGI_FORMAT_R8_UNORM, 0, desc->Usage, desc->BindFlags, desc->CPUAccessFlags, desc->MiscFlags, initial_data, dxgi_usage, out_buffer ? &resource : 0); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(hr != S_OK) 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return hr; 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_buffer = new GalliumD3D11Buffer(this, resource, *desc, dxgi_usage); 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE OpenGalliumResource( 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* resource, 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IUnknown** dxgi_resource) 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* TODO: maybe support others */ 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(resource->target == PIPE_TEXTURE_2D); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dxgi_resource = 0; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_TEXTURE2D_DESC desc; 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&desc, 0, sizeof(desc)); 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.Width = resource->width0; 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.Height = resource->height0; 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_pipe_to_dxgi_format(); 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.Format = pipe_to_dxgi_format[resource->format]; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.SampleDesc.Count = resource->nr_samples; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.SampleDesc.Quality = 0; 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.ArraySize = 1; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.MipLevels = resource->last_level + 1; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(resource->bind & PIPE_BIND_RENDER_TARGET) 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.BindFlags |= D3D11_BIND_RENDER_TARGET; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(resource->bind & PIPE_BIND_DEPTH_STENCIL) 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.BindFlags |= D3D11_BIND_DEPTH_STENCIL; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(resource->bind & PIPE_BIND_SAMPLER_VIEW) 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(resource->bind & PIPE_BIND_SHARED) 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_USAGE dxgi_usage = d3d_to_dxgi_usage(desc.BindFlags, desc.MiscFlags); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(desc.MipLevels == 1 && desc.ArraySize == 1) 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dxgi_resource = (ID3D11Texture2D*)new GalliumD3D11Surface(this, resource, desc, dxgi_usage); 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *dxgi_resource = (ID3D11Texture2D*)new GalliumD3D11Texture2D(this, resource, desc, dxgi_usage); 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateSurface( 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const DXGI_SURFACE_DESC *dxgi_desc, 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned count, 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DXGI_USAGE usage, 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const DXGI_SHARED_RESOURCE *shared_resource, 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDXGISurface **out_surface) 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_TEXTURE2D_DESC desc; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&desc, 0, sizeof(desc)); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource* resource; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.Width = dxgi_desc->Width; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.Height = dxgi_desc->Height; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.Format = dxgi_desc->Format; 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.SampleDesc = dxgi_desc->SampleDesc; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.ArraySize = count; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.MipLevels = 1; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(usage & DXGI_USAGE_RENDER_TARGET_OUTPUT) 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.BindFlags |= D3D11_BIND_RENDER_TARGET; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(usage & DXGI_USAGE_SHADER_INPUT) 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(usage & DXGI_USAGE_UNORDERED_ACCESS) 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(usage & DXGI_USAGE_SHARED) 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED; 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HRESULT hr = create_resource(PIPE_TEXTURE_2D, dxgi_desc->Width, dxgi_desc->Height, 1, 1, count, dxgi_desc->Format, &dxgi_desc->SampleDesc, D3D11_USAGE_DEFAULT, desc.BindFlags, D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE, desc.MiscFlags, 0, usage, &resource); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(hr != S_OK) 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return hr; 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_surface = new GalliumD3D11Surface(this, resource, desc, usage); 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateShaderResourceView( 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Resource *iresource, 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SHADER_RESOURCE_VIEW_DESC *desc, 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11ShaderResourceView **out_srv) 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_SHADER_RESOURCE_VIEW_DESC def_desc; 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(desc->ViewDimension == D3D10_1_SRV_DIMENSION_TEXTURECUBEARRAY) 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D10_SHADER_RESOURCE_VIEW_DESC1 desc1; 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&desc1, 0, sizeof(desc1)); 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&desc1, desc, sizeof(*desc)); 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CreateShaderResourceView1(iresource, &desc1, (ID3D10ShaderResourceView1**)out_srv); 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateShaderResourceView1( 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Resource *iresource, 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D10_SHADER_RESOURCE_VIEW_DESC1 *desc, 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D10ShaderResourceView1 **out_srv) 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D10_SHADER_RESOURCE_VIEW_DESC1 def_desc; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_resource* resource = ((GalliumD3D11Resource<>*)iresource)->resource; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!desc) 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_pipe_to_dxgi_format(); 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&def_desc, 0, sizeof(def_desc)); 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Format = pipe_to_dxgi_format[resource->format]; 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(resource->target) 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BUFFER: 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Buffer.ElementWidth = resource->width0; 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture1D.MipLevels = resource->last_level + 1; 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D_ARRAY: 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture1DArray.MipLevels = resource->last_level + 1; 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture1DArray.ArraySize = resource->array_size; 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_RECT: 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture2D.MipLevels = resource->last_level + 1; 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D_ARRAY: 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture2DArray.MipLevels = resource->last_level + 1; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture2DArray.ArraySize = resource->array_size; 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_3D: 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture3D.MipLevels = resource->last_level + 1; 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_CUBE: 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(resource->array_size > 6) 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.TextureCubeArray.NumCubes = resource->array_size / 6; 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.TextureCube.MipLevels = resource->last_level + 1; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = &def_desc; 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view templat; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templat, 0, sizeof(templat)); 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(invalid(format >= DXGI_FORMAT_COUNT)) 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.format = (desc->Format == DXGI_FORMAT_UNKNOWN) ? resource->format : dxgi_to_pipe_format[desc->Format]; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!templat.format) 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.swizzle_r = PIPE_SWIZZLE_RED; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.swizzle_g = PIPE_SWIZZLE_GREEN; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.swizzle_b = PIPE_SWIZZLE_BLUE; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.swizzle_a = PIPE_SWIZZLE_ALPHA; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.texture = ((GalliumD3D11Resource<>*)iresource)->resource; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(desc->ViewDimension) 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice; 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1; 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBEARRAY) { 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.first_layer *= 6; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.last_layer *= 6; 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // fall through 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURE1D: 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURE2D: 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURE3D: 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURECUBE: 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // yes, this works for all of these types 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.first_level = desc->Texture1D.MostDetailedMip; 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(desc->Texture1D.MipLevels == (unsigned)-1) 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.last_level = templat.texture->last_level; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.last_level = templat.u.tex.first_level + desc->Texture1D.MipLevels - 1; 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(templat.u.tex.last_level >= templat.u.tex.first_level); 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_BUFFER: 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.buf.first_element = desc->Buffer.ElementOffset; 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.buf.last_element = desc->Buffer.ElementOffset + desc->Buffer.ElementWidth - 1; 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURE2DMS: 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_srv) 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_sampler_view* view = immediate_pipe->create_sampler_view(immediate_pipe, templat.texture, &templat); 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!view) 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_srv = new GalliumD3D11ShaderResourceView(this, (GalliumD3D11Resource<>*)iresource, view, *desc); 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateUnorderedAccessView( 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Resource *resource, 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_UNORDERED_ACCESS_VIEW_DESC *desc, 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11UnorderedAccessView **out_uav) 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // remember to return S_FALSE and not crash if out_u_a_view == 0 and parameters are valid 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateRenderTargetView( 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Resource *iresource, 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_RENDER_TARGET_VIEW_DESC *desc, 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11RenderTargetView **out_rtv) 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_resource* resource = ((GalliumD3D11Resource<>*)iresource)->resource; 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_RENDER_TARGET_VIEW_DESC def_desc; 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!desc) 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_pipe_to_dxgi_format(); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&def_desc, 0, sizeof(def_desc)); 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Format = pipe_to_dxgi_format[resource->format]; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(resource->target) 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_BUFFER: 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_RTV_DIMENSION_BUFFER; 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Buffer.ElementWidth = resource->width0; 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1D; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D_ARRAY: 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1DARRAY; 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture1DArray.ArraySize = resource->array_size; 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_RECT: 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D_ARRAY: 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture2DArray.ArraySize = resource->array_size; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_3D: 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture3D.WSize = resource->depth0; 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_CUBE: 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture2DArray.ArraySize = 6; 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = &def_desc; 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface templat; 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templat, 0, sizeof(templat)); 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(invalid(desc->format >= DXGI_FORMAT_COUNT)) 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.format = (desc->Format == DXGI_FORMAT_UNKNOWN) ? resource->format : dxgi_to_pipe_format[desc->Format]; 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!templat.format) 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.usage = PIPE_BIND_RENDER_TARGET; 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.texture = ((GalliumD3D11Resource<>*)iresource)->resource; 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(desc->ViewDimension) 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_TEXTURE1D: 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_TEXTURE2D: 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.level = desc->Texture1D.MipSlice; 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_TEXTURE3D: 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.level = desc->Texture3D.MipSlice; 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.first_layer = desc->Texture3D.FirstWSlice; 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.last_layer = desc->Texture3D.FirstWSlice + desc->Texture3D.WSize - 1; 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.level = desc->Texture1DArray.MipSlice; 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice; 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1; 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_BUFFER: 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.buf.first_element = desc->Buffer.ElementOffset; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.buf.last_element = desc->Buffer.ElementOffset + desc->Buffer.ElementWidth - 1; 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_TEXTURE2DMS: 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_rtv) 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface* surface = immediate_pipe->create_surface(immediate_pipe, templat.texture, &templat); 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!surface) 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_rtv = new GalliumD3D11RenderTargetView(this, (GalliumD3D11Resource<>*)iresource, surface, *desc); 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateDepthStencilView( 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Resource *iresource, 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_DEPTH_STENCIL_VIEW_DESC *desc, 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11DepthStencilView **out_depth_stencil_view) 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pipe_resource* resource = ((GalliumD3D11Resource<>*)iresource)->resource; 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_DEPTH_STENCIL_VIEW_DESC def_desc; 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!desc) 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org init_pipe_to_dxgi_format(); 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&def_desc, 0, sizeof(def_desc)); 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Format = pipe_to_dxgi_format[resource->format]; 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(resource->target) 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D: 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE1D; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_1D_ARRAY: 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE1DARRAY; 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture1DArray.ArraySize = resource->array_size; 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D: 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_RECT: 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_2D_ARRAY: 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture2DArray.ArraySize = resource->array_size; 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_TEXTURE_CUBE: 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org def_desc.Texture2DArray.ArraySize = 6; 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc = &def_desc; 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface templat; 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templat, 0, sizeof(templat)); 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(invalid(desc->format >= DXGI_FORMAT_COUNT)) 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.format = (desc->Format == DXGI_FORMAT_UNKNOWN) ? resource->format : dxgi_to_pipe_format[desc->Format]; 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!templat.format) 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.usage = PIPE_BIND_DEPTH_STENCIL; 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.texture = ((GalliumD3D11Resource<>*)iresource)->resource; 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(desc->ViewDimension) 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_DSV_DIMENSION_TEXTURE1D: 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_DSV_DIMENSION_TEXTURE2D: 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.level = desc->Texture1D.MipSlice; 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.level = desc->Texture1DArray.MipSlice; 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1; 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_DSV_DIMENSION_TEXTURE2DMS: 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_depth_stencil_view) 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface* surface = immediate_pipe->create_surface(immediate_pipe, templat.texture, &templat); 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!surface) 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_depth_stencil_view = new GalliumD3D11DepthStencilView(this, (GalliumD3D11Resource<>*)iresource, surface, *desc); 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define D3D1X_SHVER_GEOMETRY_SHADER 2 /* D3D11_SHVER_GEOMETRY_SHADER */ 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11Shader<>* create_stage_shader(unsigned type, const void* shader_bytecode, SIZE_T bytecode_length 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org , ID3D11ClassLinkage *class_linkage 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org , struct pipe_stream_output_info* so_info) 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool dump = debug_get_option_dump_shaders(); 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::auto_ptr<sm4_program> sm4(0); 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dxbc_chunk_header* sm4_chunk = dxbc_find_shader_bytecode(shader_bytecode, bytecode_length); 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!sm4_chunk) 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(so_info) 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sm4.reset(new sm4_program()); 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sm4.reset(sm4_parse(sm4_chunk + 1, bswap_le32(sm4_chunk->size))); 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // check if this is a dummy GS, in which case we only need a place to store the signature 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(sm4.get() && so_info && sm4->version.type != D3D1X_SHVER_GEOMETRY_SHADER) 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sm4.reset(new sm4_program()); 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!sm4.get()) 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dump) 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sm4->dump(); 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dxbc_chunk_signature* sig; 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_INPUT_SIGNATURE); 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(sig) 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sm4->num_params_in = dxbc_parse_signature(sig, &sm4->params_in); 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE); 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(sig) 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sm4->num_params_out = dxbc_parse_signature(sig, &sm4->params_out); 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_PATCH_SIGNATURE); 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(sig) 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sm4->num_params_patch = dxbc_parse_signature(sig, &sm4->params_patch); 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_shader_state tgsi_shader; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&tgsi_shader, 0, sizeof(tgsi_shader)); 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(so_info) 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(&tgsi_shader.stream_output, so_info, sizeof(tgsi_shader.stream_output)); 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(so_info && sm4->version.type != D3D1X_SHVER_GEOMETRY_SHADER) 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_shader.tokens = (const tgsi_token*)sm4_to_tgsi_linkage_only(*sm4); 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_shader.tokens = (const tgsi_token*)sm4_to_tgsi(*sm4); 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!tgsi_shader.tokens) 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(dump) 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dump(tgsi_shader.tokens, 0); 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void* shader_cso; 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11Shader<>* shader; 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(type) 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_VERTEX: 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_cso = immediate_pipe->create_vs_state(immediate_pipe, &tgsi_shader); 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = (GalliumD3D11Shader<>*)new GalliumD3D11VertexShader(this, shader_cso); 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_FRAGMENT: 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_cso = immediate_pipe->create_fs_state(immediate_pipe, &tgsi_shader); 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = (GalliumD3D11Shader<>*)new GalliumD3D11PixelShader(this, shader_cso); 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_SHADER_GEOMETRY: 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_cso = immediate_pipe->create_gs_state(immediate_pipe, &tgsi_shader); 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = (GalliumD3D11Shader<>*)new GalliumD3D11GeometryShader(this, shader_cso); 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader_cso = 0; 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader = 0; 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void*)tgsi_shader.tokens); 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return shader; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CREATE_SHADER_ARGS \ 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *shader_bytecode, \ 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SIZE_T bytecode_length, \ 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11ClassLinkage *class_linkage 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PASS_SHADER_ARGS shader_bytecode, bytecode_length, class_linkage 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CREATE_SHADER_ARGS \ 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *shader_bytecode, \ 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SIZE_T bytecode_length 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PASS_SHADER_ARGS shader_bytecode, bytecode_length 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMPLEMENT_CREATE_SHADER(Stage, GALLIUM) \ 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE Create##Stage##Shader( \ 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CREATE_SHADER_ARGS, \ 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11##Stage##Shader **out_shader) \ 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { \ 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; \ 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11##Stage##Shader* shader = (GalliumD3D11##Stage##Shader*)create_stage_shader(PIPE_SHADER_##GALLIUM, PASS_SHADER_ARGS, NULL); \ 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!shader) \ 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; \ 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(out_shader) \ 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { \ 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_shader = shader; \ 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; \ 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else \ 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { \ 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shader->Release(); \ 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; \ 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IMPLEMENT_NOTIMPL_CREATE_SHADER(Stage) \ 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE Create##Stage##Shader( \ 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CREATE_SHADER_ARGS, \ 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11##Stage##Shader **out_shader) \ 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { \ 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; \ 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMPLEMENT_CREATE_SHADER(Vertex, VERTEX) 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMPLEMENT_CREATE_SHADER(Pixel, FRAGMENT) 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMPLEMENT_CREATE_SHADER(Geometry, GEOMETRY) 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMPLEMENT_NOTIMPL_CREATE_SHADER(Hull) 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMPLEMENT_NOTIMPL_CREATE_SHADER(Domain) 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IMPLEMENT_NOTIMPL_CREATE_SHADER(Compute) 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateGeometryShaderWithStreamOutput( 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *shader_bytecode, 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SIZE_T bytecode_length, 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_SO_DECLARATION_ENTRY *so_declaration, 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_entries, 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned *buffer_strides, 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_strides, 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned rasterized_stream, 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11ClassLinkage *class_linkage, 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UINT output_stream_stride, 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11GeometryShader **out_geometry_shader) 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11GeometryShader* gs; 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(rasterized_stream != 0) 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; // not yet supported by gallium 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct dxbc_chunk_signature* sig = dxbc_find_signature(shader_bytecode, bytecode_length, DXBC_FIND_OUTPUT_SIGNATURE); 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!sig) 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org D3D11_SIGNATURE_PARAMETER_DESC* out; 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned num_outputs = dxbc_parse_signature(sig, &out); 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_stream_output_info so; 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&so, 0, sizeof(so)); 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(num_strides) 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.stride = buffer_strides[0]; 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(num_strides > 1) 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Warning: multiple user-specified strides not implemented !\n"); 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.stride = output_stream_stride; 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(unsigned i = 0; i < num_entries; ++i) 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned j; 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(j = 0; j < num_outputs; ++j) 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(out[j].SemanticIndex == so_declaration[i].SemanticIndex && !strcasecmp(out[j].SemanticName, so_declaration[i].SemanticName)) 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(j >= num_outputs) 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int first_comp = ffs(out[j].Mask) - 1 + so_declaration[i].StartComponent; 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.output[i].output_buffer = so_declaration[i].OutputSlot; 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.output[i].register_index = out[j].Register; 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org so.output[i].register_mask = ((1 << so_declaration[i].ComponentCount) - 1) << first_comp; 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++so.num_outputs; 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(out) 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(out); 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs = reinterpret_cast<GalliumD3D11GeometryShader*>(create_stage_shader(PIPE_SHADER_GEOMETRY, PASS_SHADER_ARGS, &so)); 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!gs) 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_geometry_shader) { 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gs->Release(); 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_geometry_shader = gs; 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateClassLinkage( 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11ClassLinkage **out_linkage) 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateQuery( 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_QUERY_DESC *query_desc, 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Query **out_query) 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(invalid(query_desc->Query >= D3D11_QUERY_COUNT)) 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned query_type = d3d11_to_pipe_query[query_desc->Query]; 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(query_type >= PIPE_QUERY_TYPES) 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!out_query) 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_query* query = immediate_pipe->create_query(immediate_pipe, query_type); 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!query) 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_query = new GalliumD3D11Query(this, query, d3d11_query_size[query_desc->Query], *query_desc); 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreatePredicate( 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_QUERY_DESC *predicate_desc, 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Predicate **out_predicate) 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned query_type; 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(predicate_desc->Query) 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_QUERY_SO_OVERFLOW_PREDICATE: 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query_type = PIPE_QUERY_SO_OVERFLOW_PREDICATE; 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case D3D11_QUERY_OCCLUSION_PREDICATE: 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org query_type = PIPE_QUERY_OCCLUSION_PREDICATE; 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_INVALIDARG; 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(out_predicate) 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_FALSE; 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_query* query = immediate_pipe->create_query(immediate_pipe, query_type); 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!query) 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_FAIL; 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *out_predicate = new GalliumD3D11Predicate(this, query, sizeof(BOOL), *predicate_desc); 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return S_OK; 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateCounter( 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const D3D11_COUNTER_DESC *counter_desc, 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11Counter **out_counter) 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // remember to return S_FALSE if out_counter == NULL and everything is OK 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE CreateDeferredContext( 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned context_flags, 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ID3D11DeviceContext **out_deferred_context) 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // TODO: this will have to be implemented using a new Gallium util module 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // remember to return S_FALSE if out_counter == NULL and everything is OK 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual HRESULT STDMETHODCALLTYPE OpenSharedResource( 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HANDLE resource, 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org REFIID iid, 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void **out_resource) 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SYNCHRONIZED; 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // TODO: the problem here is that we need to communicate dimensions somehow 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return E_NOTIMPL; 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // remember to return S_FALSE if out_counter == NULL and everything is OK 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resou rce templat; 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle handle; 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle.stride = 0; 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle.handle = resource; 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handle.type = DRM_API_HANDLE_TYPE_SHARED; 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->resource_from_handle(screen, &templat, &handle); 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API < 11 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* these are documented as "Not implemented". 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * According to the UMDDI documentation, they apparently turn on a 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (width + 1) x (height + 1) convolution filter for 1-bit textures. 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Probably nothing uses these, assuming it has ever been implemented anywhere. 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void STDMETHODCALLTYPE SetTextFilterSize( 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UINT width, 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UINT height 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {} 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void STDMETHODCALLTYPE GetTextFilterSize( 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UINT *width, 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UINT *height 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ) 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org {} 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if API >= 11 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void STDMETHODCALLTYPE RestoreGalliumState() 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11ImmediateDeviceContext_RestoreGalliumState(immediate_context); 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void STDMETHODCALLTYPE RestoreGalliumStateBlitOnly() 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GalliumD3D11ImmediateDeviceContext_RestoreGalliumStateBlitOnly(immediate_context); 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual struct pipe_context* STDMETHODCALLTYPE GetGalliumContext(void) 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return immediate_pipe; 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SYNCHRONIZED 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1707