mirror of https://github.com/adamdruppe/arsd.git
new opengl stuff for windows from ketmar
This commit is contained in:
parent
856ce49092
commit
6826453793
132
simpledisplay.d
132
simpledisplay.d
|
@ -3642,30 +3642,24 @@ version(Windows) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void move (int x, int y) {
|
void move (int x, int y) {
|
||||||
// TODO
|
RECT rect;
|
||||||
//MoveWindow(hwnd, x, y, oops...);
|
GetWindowRect(hwnd, &rect);
|
||||||
|
MoveWindow(hwnd, x, y, rect.right, rect.bottom, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize (int w, int h) {
|
void resize (int w, int h) {
|
||||||
// TODO
|
RECT rect;
|
||||||
/*
|
GetWindowRect(hwnd, &rect);
|
||||||
if (w < 1) w = 1;
|
MoveWindow(hwnd, rect.left, rect.top, w, h, true);
|
||||||
if (h < 1) h = 1;
|
version(without_opengl) {} else
|
||||||
XResizeWindow(display, window, w, h);
|
|
||||||
glViewport(0, 0, w, h);
|
glViewport(0, 0, w, h);
|
||||||
if (windowResized !is null) windowResized(w, h);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void moveResize (int x, int y, int w, int h) {
|
void moveResize (int x, int y, int w, int h) {
|
||||||
// TODO
|
MoveWindow(hwnd, x, y, w, h, true);
|
||||||
/*
|
version(without_opengl) {} else
|
||||||
if (w < 1) w = 1;
|
|
||||||
if (h < 1) h = 1;
|
|
||||||
XMoveResizeWindow(display, window, x, y, w, h);
|
|
||||||
glViewport(0, 0, w, h);
|
glViewport(0, 0, w, h);
|
||||||
if (windowResized !is null) windowResized(w, h);
|
if (windowResized !is null) windowResized(w, h);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
version(without_opengl) {} else {
|
version(without_opengl) {} else {
|
||||||
|
@ -3728,27 +3722,55 @@ version(Windows) {
|
||||||
else {
|
else {
|
||||||
if(opengl == OpenGlOptions.yes) {
|
if(opengl == OpenGlOptions.yes) {
|
||||||
ghDC = hdc;
|
ghDC = hdc;
|
||||||
PIXELFORMATDESCRIPTOR pfd;
|
PIXELFORMATDESCRIPTOR pfd;
|
||||||
|
|
||||||
pfd.nSize = PIXELFORMATDESCRIPTOR.sizeof;
|
pfd.nSize = PIXELFORMATDESCRIPTOR.sizeof;
|
||||||
pfd.nVersion = 1;
|
pfd.nVersion = 1;
|
||||||
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
|
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
|
||||||
pfd.dwLayerMask = PFD_MAIN_PLANE;
|
pfd.dwLayerMask = PFD_MAIN_PLANE;
|
||||||
pfd.iPixelType = PFD_TYPE_RGBA;
|
pfd.iPixelType = PFD_TYPE_RGBA;
|
||||||
pfd.cColorBits = 24;
|
pfd.cColorBits = 24;
|
||||||
pfd.cDepthBits = 8;
|
pfd.cDepthBits = 24;
|
||||||
pfd.cAccumBits = 0;
|
pfd.cAccumBits = 0;
|
||||||
pfd.cStencilBits = 0;
|
pfd.cStencilBits = 8; // any reasonable OpenGL implementation should support this anyway
|
||||||
|
|
||||||
auto pixelformat = ChoosePixelFormat(hdc, &pfd);
|
auto pixelformat = ChoosePixelFormat(hdc, &pfd);
|
||||||
|
|
||||||
if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0)
|
if ((pixelformat = ChoosePixelFormat(hdc, &pfd)) == 0)
|
||||||
throw new Exception("ChoosePixelFormat");
|
throw new Exception("ChoosePixelFormat");
|
||||||
|
|
||||||
if (SetPixelFormat(hdc, pixelformat, &pfd) == 0)
|
if (SetPixelFormat(hdc, pixelformat, &pfd) == 0)
|
||||||
throw new Exception("SetPixelFormat");
|
throw new Exception("SetPixelFormat");
|
||||||
|
|
||||||
ghRC = wglCreateContext(ghDC);
|
if (sdpyOpenGLContextVersion && wglCreateContextAttribsARB is null) {
|
||||||
|
// windoze is idiotic: we have to have OpenGL context to get function addresses
|
||||||
|
// so we will create fake context to get that stupid address
|
||||||
|
auto tmpcc = wglCreateContext(ghDC);
|
||||||
|
if (tmpcc !is null) {
|
||||||
|
scope(exit) { wglMakeCurrent(ghDC, null); wglDeleteContext(tmpcc); }
|
||||||
|
wglMakeCurrent(ghDC, tmpcc);
|
||||||
|
wglInitOtherFunctions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wglCreateContextAttribsARB !is null && sdpyOpenGLContextVersion) {
|
||||||
|
int[9] contextAttribs = [
|
||||||
|
WGL_CONTEXT_MAJOR_VERSION_ARB, (sdpyOpenGLContextVersion>>8),
|
||||||
|
WGL_CONTEXT_MINOR_VERSION_ARB, (sdpyOpenGLContextVersion&0xff),
|
||||||
|
WGL_CONTEXT_PROFILE_MASK_ARB, (sdpyOpenGLContextCompatible ? WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB : WGL_CONTEXT_CORE_PROFILE_BIT_ARB),
|
||||||
|
// for modern context, set "forward compatibility" flag too
|
||||||
|
(sdpyOpenGLContextCompatible ? 0/*None*/ : WGL_CONTEXT_FLAGS_ARB), WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
|
||||||
|
0/*None*/,
|
||||||
|
];
|
||||||
|
ghRC = wglCreateContextAttribsARB(ghDC, null, contextAttribs.ptr);
|
||||||
|
if (ghRC is null)
|
||||||
|
throw new Exception("wglCreateContextAttribsARB");
|
||||||
|
} else {
|
||||||
|
// try to do at least something
|
||||||
|
ghRC = wglCreateContext(ghDC);
|
||||||
|
if (ghRC is null)
|
||||||
|
throw new Exception("wglCreateContext");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3779,6 +3801,7 @@ version(Windows) {
|
||||||
MoveWindow(hwnd,rcWindow.left, rcWindow.top, width + ptDiff.x, height + ptDiff.y, true);
|
MoveWindow(hwnd,rcWindow.left, rcWindow.top, width + ptDiff.x, height + ptDiff.y, true);
|
||||||
|
|
||||||
ShowWindow(hwnd, SW_SHOWNORMAL);
|
ShowWindow(hwnd, SW_SHOWNORMAL);
|
||||||
|
this._visibleForTheFirstTimeCalled = false; // hack!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4016,6 +4039,11 @@ version(Windows) {
|
||||||
if (this.visibilityChanged !is null) this.visibilityChanged(this._visible);
|
if (this.visibilityChanged !is null) this.visibilityChanged(this._visible);
|
||||||
break;
|
break;
|
||||||
case WM_PAINT: {
|
case WM_PAINT: {
|
||||||
|
if (!this._visibleForTheFirstTimeCalled) {
|
||||||
|
this._visibleForTheFirstTimeCalled = true;
|
||||||
|
if (this.visibleForTheFirstTime !is null) this.visibleForTheFirstTime();
|
||||||
|
}
|
||||||
|
|
||||||
BITMAP bm;
|
BITMAP bm;
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
|
|
||||||
|
@ -4817,6 +4845,7 @@ version(X11) {
|
||||||
if (w < 1) w = 1;
|
if (w < 1) w = 1;
|
||||||
if (h < 1) h = 1;
|
if (h < 1) h = 1;
|
||||||
XResizeWindow(display, window, w, h);
|
XResizeWindow(display, window, w, h);
|
||||||
|
version(without_opengl) {} else
|
||||||
glViewport(0, 0, w, h);
|
glViewport(0, 0, w, h);
|
||||||
if (windowResized !is null) windowResized(w, h);
|
if (windowResized !is null) windowResized(w, h);
|
||||||
}
|
}
|
||||||
|
@ -4825,6 +4854,7 @@ version(X11) {
|
||||||
if (w < 1) w = 1;
|
if (w < 1) w = 1;
|
||||||
if (h < 1) h = 1;
|
if (h < 1) h = 1;
|
||||||
XMoveResizeWindow(display, window, x, y, w, h);
|
XMoveResizeWindow(display, window, x, y, w, h);
|
||||||
|
version(without_opengl) {} else
|
||||||
glViewport(0, 0, w, h);
|
glViewport(0, 0, w, h);
|
||||||
if (windowResized !is null) windowResized(w, h);
|
if (windowResized !is null) windowResized(w, h);
|
||||||
}
|
}
|
||||||
|
@ -8087,6 +8117,8 @@ version(html5) {
|
||||||
|
|
||||||
version(without_opengl) {} else
|
version(without_opengl) {} else
|
||||||
extern(System) nothrow @nogc {
|
extern(System) nothrow @nogc {
|
||||||
|
enum uint GL_VERSION = 0x1F02;
|
||||||
|
const(char)* glGetString (/*GLenum*/uint);
|
||||||
version(X11) {
|
version(X11) {
|
||||||
struct __GLXFBConfigRec {}
|
struct __GLXFBConfigRec {}
|
||||||
alias GLXFBConfig = __GLXFBConfigRec*;
|
alias GLXFBConfig = __GLXFBConfigRec*;
|
||||||
|
@ -8138,6 +8170,47 @@ extern(System) nothrow @nogc {
|
||||||
}
|
}
|
||||||
_glx_swapInterval_fn(dpy, drawable, (wait ? 1 : 0));
|
_glx_swapInterval_fn(dpy, drawable, (wait ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
} else version(Windows) {
|
||||||
|
enum GL_TRUE = 1;
|
||||||
|
enum GL_FALSE = 0;
|
||||||
|
alias int GLint;
|
||||||
|
|
||||||
|
public void* glGetProcAddress (const(char)* name) {
|
||||||
|
void* res = wglGetProcAddress(name);
|
||||||
|
if (res is null) {
|
||||||
|
//{ import core.stdc.stdio; printf("GL: '%s' not found (0)\n", name); }
|
||||||
|
import core.sys.windows.windef, core.sys.windows.winbase;
|
||||||
|
static HINSTANCE dll = null;
|
||||||
|
if (dll is null) {
|
||||||
|
dll = LoadLibraryA("opengl32.dll");
|
||||||
|
if (dll is null) return null; // <32, but idc
|
||||||
|
}
|
||||||
|
res = GetProcAddress(dll, name);
|
||||||
|
}
|
||||||
|
//{ import core.stdc.stdio; printf(" GL: '%s' is 0x%08x\n", name, cast(uint)res); }
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum WGL_CONTEXT_MAJOR_VERSION_ARB = 0x2091;
|
||||||
|
enum WGL_CONTEXT_MINOR_VERSION_ARB = 0x2092;
|
||||||
|
enum WGL_CONTEXT_LAYER_PLANE_ARB = 0x2093;
|
||||||
|
enum WGL_CONTEXT_FLAGS_ARB = 0x2094;
|
||||||
|
enum WGL_CONTEXT_PROFILE_MASK_ARB = 0x9126;
|
||||||
|
|
||||||
|
enum WGL_CONTEXT_DEBUG_BIT_ARB = 0x0001;
|
||||||
|
enum WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB = 0x0002;
|
||||||
|
|
||||||
|
enum WGL_CONTEXT_CORE_PROFILE_BIT_ARB = 0x00000001;
|
||||||
|
enum WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB = 0x00000002;
|
||||||
|
|
||||||
|
alias wglCreateContextAttribsARB_fna = HGLRC function (HDC hDC, HGLRC hShareContext, const(int)* attribList);
|
||||||
|
__gshared wglCreateContextAttribsARB_fna wglCreateContextAttribsARB = null;
|
||||||
|
|
||||||
|
void wglInitOtherFunctions () {
|
||||||
|
if (wglCreateContextAttribsARB is null) {
|
||||||
|
wglCreateContextAttribsARB = cast(wglCreateContextAttribsARB_fna)glGetProcAddress("wglCreateContextAttribsARB");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void glGetIntegerv(int, void*);
|
void glGetIntegerv(int, void*);
|
||||||
|
@ -8258,6 +8331,7 @@ extern(System) nothrow @nogc {
|
||||||
enum int GL_COLOR_BUFFER_BIT = 0x00004000;
|
enum int GL_COLOR_BUFFER_BIT = 0x00004000;
|
||||||
enum int GL_ACCUM_BUFFER_BIT = 0x00000200;
|
enum int GL_ACCUM_BUFFER_BIT = 0x00000200;
|
||||||
enum int GL_DEPTH_BUFFER_BIT = 0x00000100;
|
enum int GL_DEPTH_BUFFER_BIT = 0x00000100;
|
||||||
|
enum uint GL_STENCIL_BUFFER_BIT = 0x00000400;
|
||||||
|
|
||||||
enum int GL_POINTS = 0x0000;
|
enum int GL_POINTS = 0x0000;
|
||||||
enum int GL_LINES = 0x0001;
|
enum int GL_LINES = 0x0001;
|
||||||
|
|
Loading…
Reference in New Issue