mirror of https://github.com/buggins/dlangui.git
X11 backend OpenGL support is working
This commit is contained in:
parent
b94e4c0ba5
commit
6109734295
|
@ -22,6 +22,7 @@ version(USE_OPENGL):
|
||||||
|
|
||||||
import dlangui.core.logger;
|
import dlangui.core.logger;
|
||||||
import derelict.opengl3.gl3;
|
import derelict.opengl3.gl3;
|
||||||
|
import derelict.opengl3.gl;
|
||||||
import dlangui.core.types;
|
import dlangui.core.types;
|
||||||
import std.conv;
|
import std.conv;
|
||||||
import std.string;
|
import std.string;
|
||||||
|
@ -689,13 +690,20 @@ __gshared GLSupport _glSupport;
|
||||||
|
|
||||||
class GLSupport {
|
class GLSupport {
|
||||||
|
|
||||||
|
private bool _legacyMode;
|
||||||
|
@property bool legacyMode() { return _legacyMode; }
|
||||||
|
|
||||||
|
this(bool legacy = false) {
|
||||||
|
_legacyMode = legacy;
|
||||||
|
}
|
||||||
|
|
||||||
TextureProgram _textureProgram;
|
TextureProgram _textureProgram;
|
||||||
SolidFillProgram _solidFillProgram;
|
SolidFillProgram _solidFillProgram;
|
||||||
LineProgram _lineProgram;
|
LineProgram _lineProgram;
|
||||||
FontProgram _fontProgram;
|
FontProgram _fontProgram;
|
||||||
|
|
||||||
@property bool valid() {
|
@property bool valid() {
|
||||||
return _textureProgram && _solidFillProgram && _fontProgram && _lineProgram;
|
return _legacyMode || _textureProgram && _solidFillProgram && _fontProgram && _lineProgram;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool initShaders() {
|
bool initShaders() {
|
||||||
|
@ -825,12 +833,38 @@ class GLSupport {
|
||||||
x0,y0,Z_2D,
|
x0,y0,Z_2D,
|
||||||
x1,y1,Z_2D,
|
x1,y1,Z_2D,
|
||||||
x1,y0,Z_2D];
|
x1,y0,Z_2D];
|
||||||
|
|
||||||
|
if (_legacyMode) {
|
||||||
|
glColor4f(1,1,1,1);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
checkError("glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)");
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_VERTEX_ARRAY)");
|
||||||
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_COLOR_ARRAY)");
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr);
|
||||||
|
checkError("glVertexPointer(3, GL_FLOAT, 0, vertices)");
|
||||||
|
glColorPointer(4, GL_FLOAT, 0, cast(void*)colors);
|
||||||
|
checkError("glColorPointer(4, GL_FLOAT, 0, colors)");
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||||
|
checkError("glDrawArrays(GL_TRIANGLES, 0, 6)");
|
||||||
|
|
||||||
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
} else {
|
||||||
if (_solidFillProgram !is null) {
|
if (_solidFillProgram !is null) {
|
||||||
//Log.d("solid fill: vertices ", vertices, " colors ", colors);
|
//Log.d("solid fill: vertices ", vertices, " colors ", colors);
|
||||||
_solidFillProgram.execute(vertices, colors);
|
_solidFillProgram.execute(vertices, colors);
|
||||||
} else
|
} else
|
||||||
Log.e("No program");
|
Log.e("No program");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void drawColorAndTextureGlyphRect(uint textureId, int tdx, int tdy, Rect srcrc, Rect dstrc, uint color) {
|
void drawColorAndTextureGlyphRect(uint textureId, int tdx, int tdy, Rect srcrc, Rect dstrc, uint color) {
|
||||||
//Log.v("drawColorAndGlyphRect tx=", textureId, " src=", srcrc, " dst=", dstrc);
|
//Log.v("drawColorAndGlyphRect tx=", textureId, " src=", srcrc, " dst=", dstrc);
|
||||||
|
@ -863,7 +897,53 @@ class GLSupport {
|
||||||
dstx1, dsty1, Z_2D,
|
dstx1, dsty1, Z_2D,
|
||||||
dstx1, dsty0, Z_2D];
|
dstx1, dsty0, Z_2D];
|
||||||
float[2 * 6] texcoords = [srcx0,srcy0, srcx0,srcy1, srcx1,srcy1, srcx0,srcy0, srcx1,srcy1, srcx1,srcy0];
|
float[2 * 6] texcoords = [srcx0,srcy0, srcx0,srcy1, srcx1,srcy1, srcx0,srcy0, srcx1,srcy1, srcx1,srcy0];
|
||||||
|
|
||||||
|
if (_legacyMode) {
|
||||||
|
bool linear = dx != srcdx || dy != srcdy;
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
checkError("glActiveTexture");
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
checkError("glEnable(GL_TEXTURE_2D)");
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textureId);
|
||||||
|
checkError("glBindTexture");
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, linear ? GL_LINEAR : GL_NEAREST);
|
||||||
|
checkError("drawColorAndTextureRect - glTexParameteri");
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, linear ? GL_LINEAR : GL_NEAREST);
|
||||||
|
checkError("drawColorAndTextureRect - glTexParameteri");
|
||||||
|
|
||||||
|
glColor4f(1,1,1,1);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
checkError("glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)");
|
||||||
|
|
||||||
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_COLOR_ARRAY)");
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_VERTEX_ARRAY)");
|
||||||
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_TEXTURE_COORD_ARRAY)");
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr);
|
||||||
|
checkError("glVertexPointer(3, GL_FLOAT, 0, vertices)");
|
||||||
|
glTexCoordPointer(2, GL_FLOAT, 0, cast(void*)texcoords.ptr);
|
||||||
|
checkError("glTexCoordPointer(2, GL_FLOAT, 0, texcoords)");
|
||||||
|
glColorPointer(4, GL_FLOAT, 0, cast(void*)colors.ptr);
|
||||||
|
checkError("glColorPointer(4, GL_FLOAT, 0, colors)");
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||||
|
checkError("glDrawArrays");
|
||||||
|
|
||||||
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
} else {
|
||||||
_fontProgram.execute(vertices, texcoords, colors, textureId, false);
|
_fontProgram.execute(vertices, texcoords, colors, textureId, false);
|
||||||
|
}
|
||||||
//drawColorAndTextureRect(vertices, texcoords, colors, textureId, linear);
|
//drawColorAndTextureRect(vertices, texcoords, colors, textureId, linear);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -897,7 +977,52 @@ class GLSupport {
|
||||||
dstx1,dsty1,Z_2D,
|
dstx1,dsty1,Z_2D,
|
||||||
dstx1,dsty0,Z_2D];
|
dstx1,dsty0,Z_2D];
|
||||||
float[2 * 6] texcoords = [srcx0,srcy0, srcx0,srcy1, srcx1,srcy1, srcx0,srcy0, srcx1,srcy1, srcx1,srcy0];
|
float[2 * 6] texcoords = [srcx0,srcy0, srcx0,srcy1, srcx1,srcy1, srcx0,srcy0, srcx1,srcy1, srcx1,srcy0];
|
||||||
|
|
||||||
|
if (_legacyMode) {
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
checkError("glActiveTexture");
|
||||||
|
glEnable(GL_TEXTURE_2D);
|
||||||
|
checkError("glEnable(GL_TEXTURE_2D)");
|
||||||
|
glBindTexture(GL_TEXTURE_2D, textureId);
|
||||||
|
checkError("glBindTexture");
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, linear ? GL_LINEAR : GL_NEAREST);
|
||||||
|
checkError("drawColorAndTextureRect - glTexParameteri");
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, linear ? GL_LINEAR : GL_NEAREST);
|
||||||
|
checkError("drawColorAndTextureRect - glTexParameteri");
|
||||||
|
|
||||||
|
glColor4f(1,1,1,1);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
checkError("glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)");
|
||||||
|
|
||||||
|
glEnableClientState(GL_COLOR_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_COLOR_ARRAY)");
|
||||||
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_VERTEX_ARRAY)");
|
||||||
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
checkError("glEnableClientState(GL_TEXTURE_COORD_ARRAY)");
|
||||||
|
glVertexPointer(3, GL_FLOAT, 0, cast(void*)vertices.ptr);
|
||||||
|
checkError("glVertexPointer(3, GL_FLOAT, 0, vertices)");
|
||||||
|
glTexCoordPointer(2, GL_FLOAT, 0, cast(void*)texcoords.ptr);
|
||||||
|
checkError("glTexCoordPointer(2, GL_FLOAT, 0, texcoords)");
|
||||||
|
glColorPointer(4, GL_FLOAT, 0, cast(void*)colors.ptr);
|
||||||
|
checkError("glColorPointer(4, GL_FLOAT, 0, colors)");
|
||||||
|
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 6);
|
||||||
|
checkError("glDrawArrays");
|
||||||
|
|
||||||
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
|
glDisableClientState(GL_VERTEX_ARRAY);
|
||||||
|
glDisableClientState(GL_COLOR_ARRAY);
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
glDisable(GL_TEXTURE_2D);
|
||||||
|
} else {
|
||||||
_textureProgram.execute(vertices, texcoords, colors, textureId, linear);
|
_textureProgram.execute(vertices, texcoords, colors, textureId, linear);
|
||||||
|
}
|
||||||
//drawColorAndTextureRect(vertices, texcoords, colors, textureId, linear);
|
//drawColorAndTextureRect(vertices, texcoords, colors, textureId, linear);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1155,6 +1280,20 @@ class GLSupport {
|
||||||
bufferDx = view.width;
|
bufferDx = view.width;
|
||||||
bufferDy = view.height;
|
bufferDy = view.height;
|
||||||
QMatrix4x4_ortho(view.left, view.right, view.top, view.bottom, 0.5f, 50.0f);
|
QMatrix4x4_ortho(view.left, view.right, view.top, view.bottom, 0.5f, 50.0f);
|
||||||
|
//myGlOrtho(0, dx, 0, dy, 0.1f, 5.0f);
|
||||||
|
|
||||||
|
if (_legacyMode) {
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
//glPushMatrix();
|
||||||
|
//checkError("glPushMatrix");
|
||||||
|
//glLoadIdentity();
|
||||||
|
glLoadMatrixf(qtmatrix.ptr);
|
||||||
|
//glOrthof(0, _dx, 0, _dy, -1.0f, 1.0f);
|
||||||
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
//glPushMatrix();
|
||||||
|
//checkError("glPushMatrix");
|
||||||
|
glLoadIdentity();
|
||||||
|
}
|
||||||
glViewport(view.left, view.top, view.right, view.bottom);
|
glViewport(view.left, view.top, view.right, view.bottom);
|
||||||
checkError("glViewport");
|
checkError("glViewport");
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import x11.X;
|
||||||
|
|
||||||
version (USE_OPENGL) {
|
version (USE_OPENGL) {
|
||||||
import derelict.opengl3.gl3;
|
import derelict.opengl3.gl3;
|
||||||
|
import derelict.opengl3.gl;
|
||||||
import dlangui.graphics.gldrawbuf;
|
import dlangui.graphics.gldrawbuf;
|
||||||
import dlangui.graphics.glsupport;
|
import dlangui.graphics.glsupport;
|
||||||
import derelict.opengl3.glx;
|
import derelict.opengl3.glx;
|
||||||
|
@ -340,7 +341,7 @@ class X11Window : DWindow {
|
||||||
DerelictGL3.reload(GLVersion.GL21, GLVersion.GL40);
|
DerelictGL3.reload(GLVersion.GL21, GLVersion.GL40);
|
||||||
_gl3Reloaded = true;
|
_gl3Reloaded = true;
|
||||||
if (!_glSupport)
|
if (!_glSupport)
|
||||||
_glSupport = new GLSupport();
|
_glSupport = new GLSupport(true);
|
||||||
if (!glSupport.valid && !glSupport.initShaders())
|
if (!glSupport.valid && !glSupport.initShaders())
|
||||||
_enableOpengl = false;
|
_enableOpengl = false;
|
||||||
glXMakeCurrent(x11display, cast(uint)_win, null);
|
glXMakeCurrent(x11display, cast(uint)_win, null);
|
||||||
|
@ -406,6 +407,7 @@ class X11Window : DWindow {
|
||||||
ColorDrawBuf _drawbuf;
|
ColorDrawBuf _drawbuf;
|
||||||
protected void drawUsingBitmap() {
|
protected void drawUsingBitmap() {
|
||||||
if (_dx > 0 && _dy > 0) {
|
if (_dx > 0 && _dy > 0) {
|
||||||
|
//Log.d("drawUsingBitmap()");
|
||||||
// prepare drawbuf
|
// prepare drawbuf
|
||||||
if (_drawbuf is null)
|
if (_drawbuf is null)
|
||||||
_drawbuf = new ColorDrawBuf(_dx, _dy);
|
_drawbuf = new ColorDrawBuf(_dx, _dy);
|
||||||
|
@ -443,6 +445,27 @@ class X11Window : DWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void drawUsingOpengl() {
|
||||||
|
version(USE_OPENGL) {
|
||||||
|
//Log.d("drawUsingOpengl()");
|
||||||
|
glXMakeCurrent(x11display, cast(uint)_win, _glc);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
glViewport(0, 0, _dx, _dy);
|
||||||
|
float a = 1.0f;
|
||||||
|
float r = ((_backgroundColor >> 16) & 255) / 255.0f;
|
||||||
|
float g = ((_backgroundColor >> 8) & 255) / 255.0f;
|
||||||
|
float b = ((_backgroundColor >> 0) & 255) / 255.0f;
|
||||||
|
glClearColor(r, g, b, a);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
GLDrawBuf buf = new GLDrawBuf(_dx, _dy, false);
|
||||||
|
buf.beforeDrawing();
|
||||||
|
onDraw(buf);
|
||||||
|
buf.afterDrawing();
|
||||||
|
glXSwapBuffers(x11display, cast(uint)_win);
|
||||||
|
destroy(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void processExpose() {
|
void processExpose() {
|
||||||
XWindowAttributes window_attributes_return;
|
XWindowAttributes window_attributes_return;
|
||||||
XGetWindowAttributes(x11display, _win, &window_attributes_return);
|
XGetWindowAttributes(x11display, _win, &window_attributes_return);
|
||||||
|
@ -452,6 +475,9 @@ class X11Window : DWindow {
|
||||||
if (width > 0 && height > 0)
|
if (width > 0 && height > 0)
|
||||||
onResize(width, height);
|
onResize(width, height);
|
||||||
Log.d(format("processExpose(%d, %d)", width, height));
|
Log.d(format("processExpose(%d, %d)", width, height));
|
||||||
|
if (_enableOpengl)
|
||||||
|
drawUsingOpengl();
|
||||||
|
else
|
||||||
drawUsingBitmap();
|
drawUsingBitmap();
|
||||||
//Log.d("processExpose - drawing finished");
|
//Log.d("processExpose - drawing finished");
|
||||||
|
|
||||||
|
@ -1361,6 +1387,8 @@ extern(C) int DLANGUImain(string[] args)
|
||||||
try {
|
try {
|
||||||
DerelictGL3.missingSymbolCallback = &gl3MissingSymFunc;
|
DerelictGL3.missingSymbolCallback = &gl3MissingSymFunc;
|
||||||
DerelictGL3.load();
|
DerelictGL3.load();
|
||||||
|
DerelictGL.missingSymbolCallback = &gl3MissingSymFunc;
|
||||||
|
DerelictGL.load();
|
||||||
Log.d("OpenGL library loaded ok");
|
Log.d("OpenGL library loaded ok");
|
||||||
GLint[] att = [ GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None ];
|
GLint[] att = [ GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None ];
|
||||||
XWindow root;
|
XWindow root;
|
||||||
|
|
Loading…
Reference in New Issue