Add multi sampling support

This commit is contained in:
Sergeanur 2020-11-27 20:57:23 +02:00
parent e8990d5b3d
commit 497199275e
5 changed files with 69 additions and 3 deletions

View File

@ -1459,7 +1459,7 @@ startD3D(void)
d3d9Globals.present.BackBufferHeight = height;
d3d9Globals.present.BackBufferFormat = format;
d3d9Globals.present.BackBufferCount = 1;
d3d9Globals.present.MultiSampleType = D3DMULTISAMPLE_NONE;
d3d9Globals.present.MultiSampleType = (D3DMULTISAMPLE_TYPE)d3d9Globals.msLevel;
d3d9Globals.present.MultiSampleQuality = 0;
d3d9Globals.present.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3d9Globals.present.hDeviceWindow = d3d9Globals.window;
@ -1797,6 +1797,26 @@ deviceSystem(DeviceReq req, void *arg, int32 n)
rwmode->depth = findFormatDepth(d3d9Globals.modes[n].mode.Format);
rwmode->flags = d3d9Globals.modes[n].flags;
return 1;
case DEVICEGETMAXMULTISAMPLINGLEVELS:
{
assert(d3d9Globals.d3d9 != nil);
uint32 level;
DWORD quality;
for (level = D3DMULTISAMPLE_16_SAMPLES; level > D3DMULTISAMPLE_NONMASKABLE; level--) {
if (SUCCEEDED(d3d9Globals.d3d9->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3d9Globals.startMode.mode.Format,
!(d3d9Globals.startMode.flags & VIDEOMODEEXCLUSIVE), (D3DMULTISAMPLE_TYPE)level,
&quality)))
return level;
}
}
return 1;
case DEVICEGETMULTISAMPLINGLEVELS:
if (d3d9Globals.msLevel == 0)
return 1;
return d3d9Globals.msLevel;
case DEVICESETMULTISAMPLINGLEVELS:
d3d9Globals.msLevel = (uint32)n;
return 1;
}
return 1;
}

View File

@ -35,6 +35,8 @@ struct D3d9Globals
int numModes;
int currentMode;
DisplayMode startMode;
uint32 msLevel;
D3DPRESENT_PARAMETERS present;

View File

@ -414,6 +414,25 @@ Engine::getVideoModeInfo(VideoMode *info, int32 mode)
}
uint32
Engine::getMaxMultiSamplingLevels(void)
{
return engine->device.system(DEVICEGETMAXMULTISAMPLINGLEVELS, nil, 0);
}
uint32
Engine::getMultiSamplingLevels(void)
{
return engine->device.system(DEVICEGETMULTISAMPLINGLEVELS, nil, 0);
}
bool32
Engine::setMultiSamplingLevels(uint32 levels)
{
return engine->device.system(DEVICESETMULTISAMPLINGLEVELS, nil, levels);
}
namespace null {
void beginUpdate(Camera*) { }

View File

@ -57,6 +57,7 @@ struct GlGlobals
// for opening the window
int winWidth, winHeight;
const char *winTitle;
uint32 numSamples;
} glGlobals;
Gl3Caps gl3Caps;
@ -1427,7 +1428,6 @@ openGLFW(EngineOpenParams *openparams)
RWERROR((ERR_GENERAL, "glfwInit() failed"));
return 0;
}
glfwWindowHint(GLFW_SAMPLES, 0);
glGlobals.monitor = glfwGetMonitors(&glGlobals.numMonitors)[0];
@ -1474,6 +1474,7 @@ startGLFW(void)
glfwWindowHint(GLFW_GREEN_BITS, mode->mode.greenBits);
glfwWindowHint(GLFW_BLUE_BITS, mode->mode.blueBits);
glfwWindowHint(GLFW_REFRESH_RATE, mode->mode.refreshRate);
glfwWindowHint(GLFW_SAMPLES, glGlobals.numSamples);
int i;
for(i = 0; profiles[i].gl; i++){
@ -1739,6 +1740,21 @@ deviceSystemGLFW(DeviceReq req, void *arg, int32 n)
rwmode->flags = glGlobals.modes[n].flags;
return 1;
case DEVICEGETMAXMULTISAMPLINGLEVELS:
{
GLint maxSamples;
glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
if (maxSamples == 0)
return 1;
return maxSamples;
}
case DEVICEGETMULTISAMPLINGLEVELS:
if (glGlobals.numSamples == 0)
return 1;
return glGlobals.numSamples;
case DEVICESETMULTISAMPLINGLEVELS:
glGlobals.numSamples = (uint32)n;
return 1;
default:
assert(0 && "not implemented");
return 0;

View File

@ -27,7 +27,13 @@ enum DeviceReq
DEVICEGETNUMVIDEOMODES,
DEVICEGETCURRENTVIDEOMODE,
DEVICESETVIDEOMODE,
DEVICEGETVIDEOMODEINFO
DEVICEGETVIDEOMODEINFO,
// Multisampling
DEVICEGETMAXMULTISAMPLINGLEVELS,
DEVICEGETMULTISAMPLINGLEVELS,
DEVICESETMULTISAMPLINGLEVELS,
};
typedef int DeviceSystem(DeviceReq req, void *arg, int32 n);
@ -176,6 +182,9 @@ struct Engine
static bool32 setVideoMode(int32 mode);
static VideoMode *getVideoModeInfo(VideoMode *info, int32 mode);
static uint32 getMaxMultiSamplingLevels(void);
static uint32 getMultiSamplingLevels(void);
static bool32 setMultiSamplingLevels(uint32 levels);
static PluginList s_plglist;
static int32 registerPlugin(int32 size, uint32 id,