mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
121 lines
4.0 KiB
C++
121 lines
4.0 KiB
C++
/*========================================================================================
|
|
|
|
Name: ARB_multisample.cpp
|
|
Author: Colt "MainRoach" McAnlis
|
|
Date: 4/29/04
|
|
Desc: This file contains the context to load a WGL extension from a string
|
|
As well as collect the sample format available based upon the graphics card.
|
|
|
|
========================================================================================*/
|
|
|
|
#include "stdafx.h"
|
|
#include "arb_multisample.h"
|
|
#include "glew.h"
|
|
#include "wglew.h"
|
|
|
|
// Declairations We'll Use
|
|
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
|
#define WGL_SAMPLES_ARB 0x2042
|
|
|
|
bool arbMultisampleSupported = false;
|
|
int arbMultisampleFormat = 0;
|
|
|
|
// WGLisExtensionSupported: This Is A Form Of The Extension For WGL
|
|
bool WGLisExtensionSupported(const char *extension)
|
|
{
|
|
const size_t extlen = strlen(extension);
|
|
const char *supported = NULL;
|
|
|
|
// Try To Use wglGetExtensionStringARB On Current DC, If Possible
|
|
PROC wglGetExtString = wglGetProcAddress("wglGetExtensionsStringARB");
|
|
|
|
if (wglGetExtString)
|
|
supported = ((char*(__stdcall*)(HDC))wglGetExtString)(wglGetCurrentDC());
|
|
|
|
// If That Failed, Try Standard Opengl Extensions String
|
|
if (supported == NULL)
|
|
supported = (char*)glGetString(GL_EXTENSIONS);
|
|
|
|
// If That Failed Too, Must Be No Extensions Supported
|
|
if (supported == NULL)
|
|
return false;
|
|
|
|
// Begin Examination At Start Of String, Increment By 1 On False Match
|
|
for (const char* p = supported; ; p++)
|
|
{
|
|
// Advance p Up To The Next Possible Match
|
|
p = strstr(p, extension);
|
|
|
|
if (p == NULL)
|
|
return false; // No Match
|
|
|
|
// Make Sure That Match Is At The Start Of The String Or That
|
|
// The Previous Char Is A Space, Or Else We Could Accidentally
|
|
// Match "wglFunkywglExtension" With "wglExtension"
|
|
|
|
// Also, Make Sure That The Following Character Is Space Or NULL
|
|
// Or Else "wglExtensionTwo" Might Match "wglExtension"
|
|
if ((p==supported || p[-1]==' ') && (p[extlen]=='\0' || p[extlen]==' '))
|
|
return true; // Match
|
|
}
|
|
}
|
|
|
|
int InitMultisample(HINSTANCE hInstance,HWND hWnd,PIXELFORMATDESCRIPTOR pfd,int mode)
|
|
{//used to query the multisample frequencies
|
|
arbMultisampleSupported=false;
|
|
//see if the string exists in WGL!
|
|
if (!WGLisExtensionSupported("WGL_ARB_multisample"))
|
|
return 0;
|
|
//get our pixel format
|
|
PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB=(PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
|
|
if (!wglChoosePixelFormatARB)
|
|
return 0;
|
|
//get our current device context
|
|
HDC hDC=GetDC(hWnd);
|
|
int pixelFormat;
|
|
int valid;
|
|
UINT numFormats;
|
|
float fAttributes[]={0,0};
|
|
// These attributes are the bits we want to test for in our sample
|
|
// everything is pretty standard, the only one we want to
|
|
// really focus on is the SAMPLE BUFFERS ARB and WGL SAMPLES
|
|
// these two are going to do the main testing for whether or not
|
|
// we support multisampling on this hardware.
|
|
int iAttributes[]=
|
|
{
|
|
WGL_DRAW_TO_WINDOW_ARB,GL_TRUE,
|
|
WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
|
|
WGL_ACCELERATION_ARB,WGL_FULL_ACCELERATION_ARB,
|
|
WGL_COLOR_BITS_ARB,24,
|
|
WGL_ALPHA_BITS_ARB,8,
|
|
WGL_DEPTH_BITS_ARB,16,
|
|
WGL_STENCIL_BITS_ARB,0,
|
|
WGL_DOUBLE_BUFFER_ARB,GL_TRUE,
|
|
WGL_SAMPLE_BUFFERS_ARB,GL_TRUE,
|
|
WGL_SAMPLES_ARB,mode,
|
|
0,0
|
|
};
|
|
/*
|
|
//first we check to see if we can get a pixel format for 4 samples
|
|
valid=wglChoosePixelFormatARB(hDC,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
|
|
if (valid&&(numFormats>=1))
|
|
{//if we returned true, and our format count is greater than 1
|
|
arbMultisampleSupported=true;
|
|
arbMultisampleFormat=pixelFormat;
|
|
return arbMultisampleSupported;
|
|
}
|
|
*/
|
|
while (iAttributes[19]>1)
|
|
{//our pixel format with (mode) samples failed, test for less samples
|
|
valid=wglChoosePixelFormatARB(hDC,iAttributes,fAttributes,1,&pixelFormat,&numFormats);
|
|
if (valid&&(numFormats>=1))
|
|
{//if we returned true, and our format count is greater than 1
|
|
arbMultisampleSupported=true;
|
|
arbMultisampleFormat=pixelFormat;
|
|
return iAttributes[19]; //return number of samples
|
|
}
|
|
iAttributes[19]>>=1;
|
|
}
|
|
return 0;
|
|
}
|