mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-10 23:01:59 +00:00
- split Win32GLVideo in two so that the OpenGL independent part can be used for Vulkan as well.
This commit is contained in:
parent
c2d24e1dd3
commit
1519514dd7
7 changed files with 251 additions and 179 deletions
|
@ -496,7 +496,8 @@ set( PLAT_WIN32_SOURCES
|
||||||
win32/i_specialpaths.cpp
|
win32/i_specialpaths.cpp
|
||||||
win32/st_start.cpp
|
win32/st_start.cpp
|
||||||
win32/win32gliface.cpp
|
win32/win32gliface.cpp
|
||||||
win32/win32video.cpp )
|
win32/win32basevideo.cpp
|
||||||
|
win32/win32glvideo.cpp )
|
||||||
set( PLAT_POSIX_SOURCES
|
set( PLAT_POSIX_SOURCES
|
||||||
posix/i_cd.cpp
|
posix/i_cd.cpp
|
||||||
posix/i_steam.cpp )
|
posix/i_steam.cpp )
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "doomstat.h"
|
#include "doomstat.h"
|
||||||
#include "m_argv.h"
|
#include "m_argv.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
#include "win32glvideo.h"
|
||||||
#include "swrenderer/r_swrenderer.h"
|
#include "swrenderer/r_swrenderer.h"
|
||||||
|
|
||||||
EXTERN_CVAR (Bool, fullscreen)
|
EXTERN_CVAR (Bool, fullscreen)
|
||||||
|
@ -124,7 +125,7 @@ void I_InitGraphics ()
|
||||||
// are the active app. Huh?
|
// are the active app. Huh?
|
||||||
}
|
}
|
||||||
|
|
||||||
Video = gl_CreateVideo();
|
Video = new Win32GLVideo();
|
||||||
|
|
||||||
if (Video == NULL)
|
if (Video == NULL)
|
||||||
I_FatalError ("Failed to initialize display");
|
I_FatalError ("Failed to initialize display");
|
||||||
|
|
210
src/win32/win32basevideo.cpp
Normal file
210
src/win32/win32basevideo.cpp
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
/*
|
||||||
|
** win32video.cpp
|
||||||
|
** Code to let ZDoom draw to the screen
|
||||||
|
**
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
** Copyright 1998-2006 Randy Heit
|
||||||
|
** All rights reserved.
|
||||||
|
**
|
||||||
|
** Redistribution and use in source and binary forms, with or without
|
||||||
|
** modification, are permitted provided that the following conditions
|
||||||
|
** are met:
|
||||||
|
**
|
||||||
|
** 1. Redistributions of source code must retain the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer.
|
||||||
|
** 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
** notice, this list of conditions and the following disclaimer in the
|
||||||
|
** documentation and/or other materials provided with the distribution.
|
||||||
|
** 3. The name of the author may not be used to endorse or promote products
|
||||||
|
** derived from this software without specific prior written permission.
|
||||||
|
**
|
||||||
|
** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
**---------------------------------------------------------------------------
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include "wglext.h"
|
||||||
|
|
||||||
|
#include "gl_sysfb.h"
|
||||||
|
#include "hardware.h"
|
||||||
|
#include "x86.h"
|
||||||
|
#include "templates.h"
|
||||||
|
#include "version.h"
|
||||||
|
#include "c_console.h"
|
||||||
|
#include "v_video.h"
|
||||||
|
#include "i_input.h"
|
||||||
|
#include "i_system.h"
|
||||||
|
#include "doomstat.h"
|
||||||
|
#include "v_text.h"
|
||||||
|
#include "m_argv.h"
|
||||||
|
#include "doomerrors.h"
|
||||||
|
#include "Win32BaseVideo.h"
|
||||||
|
|
||||||
|
#include "gl/system/gl_framebuffer.h"
|
||||||
|
|
||||||
|
EXTERN_CVAR(Int, vid_adapter)
|
||||||
|
EXTERN_CVAR(Bool, fullscreen)
|
||||||
|
EXTERN_CVAR(Bool, vr_enable_quadbuffered)
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
Win32BaseVideo::Win32BaseVideo()
|
||||||
|
{
|
||||||
|
I_SetWndProc();
|
||||||
|
|
||||||
|
GetDisplayDeviceName();
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
struct MonitorEnumState
|
||||||
|
{
|
||||||
|
int curIdx;
|
||||||
|
HMONITOR hFoundMonitor;
|
||||||
|
};
|
||||||
|
|
||||||
|
static BOOL CALLBACK GetDisplayDeviceNameMonitorEnumProc(HMONITOR hMonitor, HDC, LPRECT, LPARAM dwData)
|
||||||
|
{
|
||||||
|
MonitorEnumState *state = reinterpret_cast<MonitorEnumState *>(dwData);
|
||||||
|
|
||||||
|
MONITORINFOEX mi;
|
||||||
|
mi.cbSize = sizeof mi;
|
||||||
|
GetMonitorInfo(hMonitor, &mi);
|
||||||
|
|
||||||
|
// This assumes the monitors are returned by EnumDisplayMonitors in the
|
||||||
|
// order they're found in the Direct3D9 adapters list. Fingers crossed...
|
||||||
|
if (state->curIdx == vid_adapter)
|
||||||
|
{
|
||||||
|
state->hFoundMonitor = hMonitor;
|
||||||
|
|
||||||
|
// Don't stop enumeration; this makes EnumDisplayMonitors fail. I like
|
||||||
|
// proper fails.
|
||||||
|
}
|
||||||
|
|
||||||
|
++state->curIdx;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void Win32BaseVideo::GetDisplayDeviceName()
|
||||||
|
{
|
||||||
|
// If anything goes wrong, anything at all, everything uses the primary
|
||||||
|
// monitor.
|
||||||
|
m_DisplayDeviceName = 0;
|
||||||
|
m_hMonitor = 0;
|
||||||
|
|
||||||
|
MonitorEnumState mes;
|
||||||
|
|
||||||
|
mes.curIdx = 1;
|
||||||
|
mes.hFoundMonitor = 0;
|
||||||
|
|
||||||
|
// Could also use EnumDisplayDevices, I guess. That might work.
|
||||||
|
if (EnumDisplayMonitors(0, 0, &GetDisplayDeviceNameMonitorEnumProc, LPARAM(&mes)))
|
||||||
|
{
|
||||||
|
if (mes.hFoundMonitor)
|
||||||
|
{
|
||||||
|
MONITORINFOEX mi;
|
||||||
|
|
||||||
|
mi.cbSize = sizeof mi;
|
||||||
|
|
||||||
|
if (GetMonitorInfo(mes.hFoundMonitor, &mi))
|
||||||
|
{
|
||||||
|
strcpy(m_DisplayDeviceBuffer, mi.szDevice);
|
||||||
|
m_DisplayDeviceName = m_DisplayDeviceBuffer;
|
||||||
|
|
||||||
|
m_hMonitor = mes.hFoundMonitor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
struct DumpAdaptersState
|
||||||
|
{
|
||||||
|
unsigned index;
|
||||||
|
char *displayDeviceName;
|
||||||
|
};
|
||||||
|
|
||||||
|
static BOOL CALLBACK DumpAdaptersMonitorEnumProc(HMONITOR hMonitor, HDC, LPRECT, LPARAM dwData)
|
||||||
|
{
|
||||||
|
DumpAdaptersState *state = reinterpret_cast<DumpAdaptersState *>(dwData);
|
||||||
|
|
||||||
|
MONITORINFOEX mi;
|
||||||
|
mi.cbSize = sizeof mi;
|
||||||
|
|
||||||
|
char moreinfo[64] = "";
|
||||||
|
|
||||||
|
bool active = true;
|
||||||
|
|
||||||
|
if (GetMonitorInfo(hMonitor, &mi))
|
||||||
|
{
|
||||||
|
bool primary = !!(mi.dwFlags & MONITORINFOF_PRIMARY);
|
||||||
|
|
||||||
|
mysnprintf(moreinfo, countof(moreinfo), " [%ldx%ld @ (%ld,%ld)]%s",
|
||||||
|
mi.rcMonitor.right - mi.rcMonitor.left,
|
||||||
|
mi.rcMonitor.bottom - mi.rcMonitor.top,
|
||||||
|
mi.rcMonitor.left, mi.rcMonitor.top,
|
||||||
|
primary ? " (Primary)" : "");
|
||||||
|
|
||||||
|
if (!state->displayDeviceName && !primary)
|
||||||
|
active = false;//primary selected, but this ain't primary
|
||||||
|
else if (state->displayDeviceName && strcmp(state->displayDeviceName, mi.szDevice) != 0)
|
||||||
|
active = false;//this isn't the selected one
|
||||||
|
}
|
||||||
|
|
||||||
|
Printf("%s%u. %s\n",
|
||||||
|
active ? TEXTCOLOR_BOLD : "",
|
||||||
|
state->index,
|
||||||
|
moreinfo);
|
||||||
|
|
||||||
|
++state->index;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
void Win32BaseVideo::DumpAdapters()
|
||||||
|
{
|
||||||
|
DumpAdaptersState das;
|
||||||
|
|
||||||
|
das.index = 1;
|
||||||
|
das.displayDeviceName = m_DisplayDeviceName;
|
||||||
|
|
||||||
|
EnumDisplayMonitors(0, 0, DumpAdaptersMonitorEnumProc, LPARAM(&das));
|
||||||
|
}
|
||||||
|
|
32
src/win32/win32basevideo.h
Normal file
32
src/win32/win32basevideo.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "v_video.h"
|
||||||
|
|
||||||
|
//==========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//==========================================================================
|
||||||
|
|
||||||
|
class Win32BaseVideo : public IVideo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Win32BaseVideo();
|
||||||
|
|
||||||
|
void DumpAdapters();
|
||||||
|
|
||||||
|
HDC m_hDC;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
HMODULE hmRender;
|
||||||
|
|
||||||
|
char m_DisplayDeviceBuffer[CCHDEVICENAME];
|
||||||
|
char *m_DisplayDeviceName;
|
||||||
|
HMONITOR m_hMonitor;
|
||||||
|
|
||||||
|
HWND m_Window;
|
||||||
|
|
||||||
|
void GetDisplayDeviceName();
|
||||||
|
public:
|
||||||
|
|
||||||
|
};
|
|
@ -461,8 +461,3 @@ int SystemGLFrameBuffer::GetClientHeight()
|
||||||
GetClientRect(Window, &rect);
|
GetClientRect(Window, &rect);
|
||||||
return rect.bottom - rect.top;
|
return rect.bottom - rect.top;
|
||||||
}
|
}
|
||||||
|
|
||||||
IVideo *gl_CreateVideo()
|
|
||||||
{
|
|
||||||
return new Win32GLVideo(0);
|
|
||||||
}
|
|
||||||
|
|
|
@ -73,96 +73,9 @@ PFNWGLCREATECONTEXTATTRIBSARBPROC myWglCreateContextAttribsARB;
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
Win32GLVideo::Win32GLVideo(int parm)
|
Win32GLVideo::Win32GLVideo()
|
||||||
{
|
{
|
||||||
I_SetWndProc();
|
|
||||||
|
|
||||||
GetDisplayDeviceName();
|
|
||||||
SetPixelFormat();
|
SetPixelFormat();
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
Win32GLVideo::~Win32GLVideo()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
struct MonitorEnumState
|
|
||||||
{
|
|
||||||
int curIdx;
|
|
||||||
HMONITOR hFoundMonitor;
|
|
||||||
};
|
|
||||||
|
|
||||||
static BOOL CALLBACK GetDisplayDeviceNameMonitorEnumProc(HMONITOR hMonitor, HDC, LPRECT, LPARAM dwData)
|
|
||||||
{
|
|
||||||
MonitorEnumState *state = reinterpret_cast<MonitorEnumState *>(dwData);
|
|
||||||
|
|
||||||
MONITORINFOEX mi;
|
|
||||||
mi.cbSize = sizeof mi;
|
|
||||||
GetMonitorInfo(hMonitor, &mi);
|
|
||||||
|
|
||||||
// This assumes the monitors are returned by EnumDisplayMonitors in the
|
|
||||||
// order they're found in the Direct3D9 adapters list. Fingers crossed...
|
|
||||||
if (state->curIdx == vid_adapter)
|
|
||||||
{
|
|
||||||
state->hFoundMonitor = hMonitor;
|
|
||||||
|
|
||||||
// Don't stop enumeration; this makes EnumDisplayMonitors fail. I like
|
|
||||||
// proper fails.
|
|
||||||
}
|
|
||||||
|
|
||||||
++state->curIdx;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void Win32GLVideo::GetDisplayDeviceName()
|
|
||||||
{
|
|
||||||
// If anything goes wrong, anything at all, everything uses the primary
|
|
||||||
// monitor.
|
|
||||||
m_DisplayDeviceName = 0;
|
|
||||||
m_hMonitor = 0;
|
|
||||||
|
|
||||||
MonitorEnumState mes;
|
|
||||||
|
|
||||||
mes.curIdx = 1;
|
|
||||||
mes.hFoundMonitor = 0;
|
|
||||||
|
|
||||||
// Could also use EnumDisplayDevices, I guess. That might work.
|
|
||||||
if (EnumDisplayMonitors(0, 0, &GetDisplayDeviceNameMonitorEnumProc, LPARAM(&mes)))
|
|
||||||
{
|
|
||||||
if (mes.hFoundMonitor)
|
|
||||||
{
|
|
||||||
MONITORINFOEX mi;
|
|
||||||
|
|
||||||
mi.cbSize = sizeof mi;
|
|
||||||
|
|
||||||
if (GetMonitorInfo(mes.hFoundMonitor, &mi))
|
|
||||||
{
|
|
||||||
strcpy(m_DisplayDeviceBuffer, mi.szDevice);
|
|
||||||
m_DisplayDeviceName = m_DisplayDeviceBuffer;
|
|
||||||
|
|
||||||
m_hMonitor = mes.hFoundMonitor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -185,71 +98,6 @@ DFrameBuffer *Win32GLVideo::CreateFrameBuffer()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
struct DumpAdaptersState
|
|
||||||
{
|
|
||||||
unsigned index;
|
|
||||||
char *displayDeviceName;
|
|
||||||
};
|
|
||||||
|
|
||||||
static BOOL CALLBACK DumpAdaptersMonitorEnumProc(HMONITOR hMonitor, HDC, LPRECT, LPARAM dwData)
|
|
||||||
{
|
|
||||||
DumpAdaptersState *state = reinterpret_cast<DumpAdaptersState *>(dwData);
|
|
||||||
|
|
||||||
MONITORINFOEX mi;
|
|
||||||
mi.cbSize = sizeof mi;
|
|
||||||
|
|
||||||
char moreinfo[64] = "";
|
|
||||||
|
|
||||||
bool active = true;
|
|
||||||
|
|
||||||
if (GetMonitorInfo(hMonitor, &mi))
|
|
||||||
{
|
|
||||||
bool primary = !!(mi.dwFlags & MONITORINFOF_PRIMARY);
|
|
||||||
|
|
||||||
mysnprintf(moreinfo, countof(moreinfo), " [%ldx%ld @ (%ld,%ld)]%s",
|
|
||||||
mi.rcMonitor.right - mi.rcMonitor.left,
|
|
||||||
mi.rcMonitor.bottom - mi.rcMonitor.top,
|
|
||||||
mi.rcMonitor.left, mi.rcMonitor.top,
|
|
||||||
primary ? " (Primary)" : "");
|
|
||||||
|
|
||||||
if (!state->displayDeviceName && !primary)
|
|
||||||
active = false;//primary selected, but this ain't primary
|
|
||||||
else if (state->displayDeviceName && strcmp(state->displayDeviceName, mi.szDevice) != 0)
|
|
||||||
active = false;//this isn't the selected one
|
|
||||||
}
|
|
||||||
|
|
||||||
Printf("%s%u. %s\n",
|
|
||||||
active ? TEXTCOLOR_BOLD : "",
|
|
||||||
state->index,
|
|
||||||
moreinfo);
|
|
||||||
|
|
||||||
++state->index;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
void Win32GLVideo::DumpAdapters()
|
|
||||||
{
|
|
||||||
DumpAdaptersState das;
|
|
||||||
|
|
||||||
das.index = 1;
|
|
||||||
das.displayDeviceName = m_DisplayDeviceName;
|
|
||||||
|
|
||||||
EnumDisplayMonitors(0, 0, DumpAdaptersMonitorEnumProc, LPARAM(&das));
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
HWND Win32GLVideo::InitDummy()
|
HWND Win32GLVideo::InitDummy()
|
||||||
{
|
{
|
||||||
HMODULE g_hInst = GetModuleHandle(NULL);
|
HMODULE g_hInst = GetModuleHandle(NULL);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "v_video.h"
|
#include "win32basevideo.h"
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
|
@ -8,35 +8,20 @@
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
class Win32GLVideo : public IVideo
|
class Win32GLVideo : public Win32BaseVideo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Win32GLVideo(int parm);
|
Win32GLVideo();
|
||||||
virtual ~Win32GLVideo();
|
|
||||||
|
|
||||||
DFrameBuffer *CreateFrameBuffer();
|
DFrameBuffer *CreateFrameBuffer() override;
|
||||||
void DumpAdapters();
|
|
||||||
bool InitHardware(HWND Window, int multisample);
|
bool InitHardware(HWND Window, int multisample);
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
HDC m_hDC;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HMODULE hmRender;
|
|
||||||
|
|
||||||
char m_DisplayDeviceBuffer[CCHDEVICENAME];
|
|
||||||
char *m_DisplayDeviceName;
|
|
||||||
HMONITOR m_hMonitor;
|
|
||||||
|
|
||||||
HWND m_Window;
|
|
||||||
HGLRC m_hRC;
|
HGLRC m_hRC;
|
||||||
|
|
||||||
HWND InitDummy();
|
HWND InitDummy();
|
||||||
void ShutdownDummy(HWND dummy);
|
void ShutdownDummy(HWND dummy);
|
||||||
bool SetPixelFormat();
|
bool SetPixelFormat();
|
||||||
bool SetupPixelFormat(int multisample);
|
bool SetupPixelFormat(int multisample);
|
||||||
|
|
||||||
void GetDisplayDeviceName();
|
|
||||||
public:
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue