diff options
author | 2015-11-20 12:42:19 +0100 | |
---|---|---|
committer | 2015-11-20 12:42:19 +0100 | |
commit | 1cda42b22e591965ee69561fcf52272bd991b3b2 (patch) | |
tree | aed5075ffe06f6fdb5ec8993bb694e0466304ad1 | |
parent | 0095c771630e95a489a2fc7911108e381ba35912 (diff) |
Fixed missing shadow mask
- fixed missing shadow mask texture when switching between window mode
and full screen
-rw-r--r-- | src/osd/modules/render/d3d/d3dhlsl.cpp | 29 | ||||
-rw-r--r-- | src/osd/modules/render/drawd3d.cpp | 48 |
2 files changed, 45 insertions, 32 deletions
diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index 09ff1508a73..61e2a4b12b5 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -101,12 +101,6 @@ shaders::shaders() : shaders::~shaders() { - if (options != NULL) - { - last_options = *options; - } - options = NULL; - cache_target *currcache = cachehead; while(cachehead != NULL) { @@ -654,11 +648,6 @@ void shaders::set_texture(texture_info *texture) void shaders::init(base *d3dintf, running_machine *machine, d3d::renderer *renderer) { - if (&machine->system() == &GAME_NAME(___empty)) - { - return; - } - if (!d3dintf->post_fx_available) { return; @@ -669,6 +658,7 @@ void shaders::init(base *d3dintf, running_machine *machine, d3d::renderer *rende { printf("Direct3D: Unable to find D3DXCreateEffectFromFileW\n"); d3dintf->post_fx_available = false; + return; } @@ -677,6 +667,12 @@ void shaders::init(base *d3dintf, running_machine *machine, d3d::renderer *rende this->d3d = renderer; this->options = renderer->get_shaders_options(); + // check if no driver loaded (not all settings might be loaded yet) + if (&machine->system() == &GAME_NAME(___empty)) + { + return; + } + windows_options &winoptions = downcast<windows_options &>(machine->options()); master_enable = winoptions.d3d_hlsl_enable(); @@ -849,6 +845,11 @@ int shaders::create_resources(bool reset) return 0; } + if (last_options.params_init) + { + options = &last_options; + } + HRESULT result = (*d3dintf->device.get_render_target)(d3d->get_device(), 0, &backbuffer); if (result != D3D_OK) { @@ -2040,6 +2041,12 @@ void shaders::delete_resources(bool reset) return; } + if (options != NULL) + { + last_options = *options; + options = NULL; + } + initialized = false; cache_target *currcache = cachehead; diff --git a/src/osd/modules/render/drawd3d.cpp b/src/osd/modules/render/drawd3d.cpp index 21b23a84d83..34a23f80901 100644 --- a/src/osd/modules/render/drawd3d.cpp +++ b/src/osd/modules/render/drawd3d.cpp @@ -800,13 +800,6 @@ int renderer::device_create(HWND device_hwnd) device_delete(); } - // create shader options only once - if (m_shaders_options == NULL) - { - m_shaders_options = (hlsl_options*)global_alloc_clear(hlsl_options); - m_shaders_options->params_init = false; - } - // verify the caps int verify = device_verify_caps(); if (verify == 2) @@ -919,9 +912,21 @@ try_again: } } - int ret = m_shaders->create_resources(false); - if (ret != 0) - return ret; + // create shader options only once + if (m_shaders_options == NULL) + { + m_shaders_options = (hlsl_options*)global_alloc_clear(hlsl_options); + m_shaders_options->params_init = false; + } + + m_shaders = (shaders*)global_alloc_clear(shaders); + m_shaders->init(d3dintf, &window().machine(), this); + + int failed = m_shaders->create_resources(false); + if (failed) + { + return failed; + } return device_create_resources(); } @@ -998,13 +1003,13 @@ int renderer::device_create_resources() renderer::~renderer() { + device_delete(); + if (m_shaders_options != NULL) { global_free(m_shaders_options); + m_shaders_options = NULL; } - m_shaders_options = NULL; - - device_delete(); } void renderer::device_delete() @@ -1024,16 +1029,16 @@ void renderer::device_delete() if (m_texture_manager != NULL) { global_free(m_texture_manager); + m_texture_manager = NULL; } - m_texture_manager = NULL; // free the device itself if (m_device != NULL) { (*d3dintf->device.reset)(m_device, &m_presentation); (*d3dintf->device.release)(m_device); + m_device = NULL; } - m_device = NULL; } @@ -1044,11 +1049,16 @@ void renderer::device_delete() void renderer::device_delete_resources() { if (m_texture_manager != NULL) + { m_texture_manager->delete_resources(); + } + // free the vertex buffer if (m_vertexbuf != NULL) + { (*d3dintf->vertexbuf.release)(m_vertexbuf); - m_vertexbuf = NULL; + m_vertexbuf = NULL; + } } @@ -1060,9 +1070,6 @@ int renderer::device_verify_caps() { int retval = 0; - m_shaders = (shaders*)global_alloc_clear(shaders); - m_shaders->init(d3dintf, &window().machine(), this); - DWORD tempcaps; HRESULT result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_MAX_PS30_INSN_SLOTS, &tempcaps); if (result != D3D_OK) osd_printf_verbose("Direct3D Error %08X during get_caps_dword call\n", (int)result); @@ -1138,9 +1145,8 @@ int renderer::device_test_cooperative() osd_printf_verbose("Direct3D: resetting device\n"); // free all existing resources and call reset on the device - //device_delete(); - device_delete_resources(); m_shaders->delete_resources(true); + device_delete_resources(); result = (*d3dintf->device.reset)(m_device, &m_presentation); // if it didn't work, punt to GDI |