(D3D10/11/12) allow building without HAVE_D3D9

This commit is contained in:
aliaspider 2018-01-30 21:33:25 +01:00
parent 4a3e4fc7de
commit b228775b0d
6 changed files with 91 additions and 18 deletions

View File

@ -13,15 +13,28 @@
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <compat/strl.h>
#include <string/stdstring.h>
#include <assert.h>
#include <dynamic/dylib.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "dxgi_common.h"
#include "../../configuration.h"
#include "../../verbosity.h"
#include "../../ui/ui_companion_driver.h"
#include "../video_driver.h"
#include "win32_common.h"
#ifdef HAVE_DYNAMIC
#include <dynamic/dylib.h>
HRESULT WINAPI CreateDXGIFactory1(REFIID riid, void** ppFactory)
{
static HRESULT(WINAPI * fp)(REFIID, void**);
#ifdef HAVE_DYNAMIC
static dylib_t dxgi_dll;
if (!dxgi_dll)
@ -32,15 +45,13 @@ HRESULT WINAPI CreateDXGIFactory1(REFIID riid, void** ppFactory)
if (!fp)
fp = (HRESULT(WINAPI*)(REFIID, void**))dylib_proc(dxgi_dll, "CreateDXGIFactory1");
#else
fp = CreateDXGIFactory1;
#endif
if (!fp)
return TYPE_E_CANTLOADLIBRARY;
return fp(riid, ppFactory);
}
#endif
DXGI_FORMAT* dxgi_get_format_fallback_list(DXGI_FORMAT format)
{
@ -267,3 +278,55 @@ void dxgi_copy(
#ifdef _MSC_VER
#pragma warning(default : 4293)
#endif
void dxgi_update_title(video_frame_info_t* video_info)
{
const ui_window_t* window = ui_companion_driver_get_window_ptr();
if (video_info->fps_show)
{
MEMORYSTATUS stat;
char mem[128];
mem[0] = '\0';
GlobalMemoryStatus(&stat);
snprintf(
mem, sizeof(mem), "|| MEM: %.2f/%.2fMB", stat.dwAvailPhys / (1024.0f * 1024.0f),
stat.dwTotalPhys / (1024.0f * 1024.0f));
strlcat(video_info->fps_text, mem, sizeof(video_info->fps_text));
}
if (window)
{
char title[128];
title[0] = '\0';
video_driver_get_window_title(title, sizeof(title));
if (title[0])
window->set_title(&main_window, title);
}
}
void dxgi_input_driver(const char* name, const input_driver_t** input, void** input_data)
{
settings_t* settings = config_get_ptr();
#if _WIN32_WINNT >= 0x0501
/* winraw only available since XP */
if (string_is_equal(settings->arrays.input_driver, "raw"))
{
*input_data = input_winraw.init(name);
if (*input_data)
{
*input = &input_winraw;
return;
}
}
#endif
*input_data = input_dinput.init(name);
*input = *input_data ? &input_dinput : NULL;
}

View File

@ -769,12 +769,16 @@ static INLINE HRESULT DXGICreateFactory(DXGIFactory* factory)
/* internal */
#include "../video_driver.h"
#define DXGI_COLOR_RGBA(r, g, b, a) (((UINT32)(a) << 24) | ((UINT32)(b) << 16) | ((UINT32)(g) << 8) | ((UINT32)(r) << 0))
typedef enum {
DXGI_FORMAT_EX_A4R4G4B4_UNORM = 1000,
} DXGI_FORMAT_EX;
RETRO_BEGIN_DECLS
DXGI_FORMAT* dxgi_get_format_fallback_list(DXGI_FORMAT format);
void dxgi_copy(
@ -787,6 +791,11 @@ void dxgi_copy(
int dst_pitch,
void* dst_data);
void dxgi_update_title(video_frame_info_t* video_info);
void dxgi_input_driver(const char* name, const input_driver_t** input, void** input_data);
RETRO_END_DECLS
#if 1
#include "../../performance_counters.h"

View File

@ -569,7 +569,7 @@ static void win32_set_droppable(ui_window_win32_t *window, bool droppable)
DragAcceptFiles_func(window->hwnd, droppable);
}
#ifdef HAVE_D3D
#if defined(HAVE_D3D) || defined (HAVE_D3D10) || defined (HAVE_D3D11) || defined (HAVE_D3D12)
LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam)
{
@ -617,9 +617,13 @@ LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message,
#endif
#ifdef HAVE_DINPUT
if (dinput && dinput_handle_message(dinput,
message, wparam, lparam))
return 0;
if (input_get_ptr() == &input_dinput)
{
void* input_data = input_get_data();
if (input_data && dinput_handle_message(input_data,
message, wparam, lparam))
return 0;
}
#endif
return DefWindowProc(hwnd, message, wparam, lparam);
}

View File

@ -78,7 +78,6 @@ d3d10_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
MONITORINFOEX current_mon;
HMONITOR hm_to_use;
settings_t* settings = config_get_ptr();
gfx_ctx_input_t inp = { input, input_data };
d3d10_video_t* d3d10 = (d3d10_video_t*)calloc(1, sizeof(*d3d10));
if (!d3d10)
@ -105,7 +104,7 @@ d3d10_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
goto error;
}
gfx_ctx_d3d.input_driver(NULL, settings->arrays.input_joypad_driver, input, input_data);
dxgi_input_driver(settings->arrays.input_joypad_driver, input, input_data);
{
UINT flags = 0;
@ -374,7 +373,7 @@ static bool d3d10_gfx_frame(
PERF_STOP();
if (msg && *msg)
gfx_ctx_d3d.update_window_title(NULL, video_info);
dxgi_update_title(video_info);
return true;
}

View File

@ -143,7 +143,6 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
MONITORINFOEX current_mon;
HMONITOR hm_to_use;
settings_t* settings = config_get_ptr();
gfx_ctx_input_t inp = { input, input_data };
d3d11_video_t* d3d11 = (d3d11_video_t*)calloc(1, sizeof(*d3d11));
if (!d3d11)
@ -170,7 +169,7 @@ d3d11_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
goto error;
}
gfx_ctx_d3d.input_driver(NULL, settings->arrays.input_joypad_driver, input, input_data);
dxgi_input_driver(settings->arrays.input_joypad_driver, input, input_data);
{
UINT flags = 0;
@ -547,7 +546,7 @@ static bool d3d11_gfx_frame(
if (msg && *msg)
{
font_driver_render_msg(video_info, NULL, msg, NULL);
gfx_ctx_d3d.update_window_title(NULL, video_info);
dxgi_update_title(video_info);
}
d3d11->sprites.enabled = false;

View File

@ -83,7 +83,6 @@ d3d12_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
{
WNDCLASSEX wndclass = { 0 };
settings_t* settings = config_get_ptr();
gfx_ctx_input_t inp = { input, input_data };
d3d12_video_t* d3d12 = (d3d12_video_t*)calloc(1, sizeof(*d3d12));
if (!d3d12)
@ -100,7 +99,7 @@ d3d12_gfx_init(const video_info_t* video, const input_driver_t** input, void** i
goto error;
}
gfx_ctx_d3d.input_driver(NULL, settings->arrays.input_joypad_driver, input, input_data);
dxgi_input_driver(settings->arrays.input_joypad_driver, input, input_data);
if (!d3d12_init_base(d3d12))
goto error;
@ -292,7 +291,7 @@ static bool d3d12_gfx_frame(
PERF_STOP();
if (msg && *msg)
gfx_ctx_d3d.update_window_title(NULL, video_info);
dxgi_update_title(video_info);
return true;
}