Scene uses ShaderManager
This commit is contained in:
parent
e2e4fe54ba
commit
d2cfeef8ae
4 changed files with 28 additions and 109 deletions
|
@ -116,75 +116,6 @@ XShmSegmentInfo SceneOpenGL::shm;
|
||||||
#include "scene_opengl_glx.cpp"
|
#include "scene_opengl_glx.cpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool SceneOpenGL::setupSceneShaders()
|
|
||||||
{
|
|
||||||
m_sceneShader = new GLShader(":/resources/scene-vertex.glsl", ":/resources/scene-fragment.glsl");
|
|
||||||
if (m_sceneShader->isValid()) {
|
|
||||||
m_sceneShader->bind();
|
|
||||||
m_sceneShader->setUniform("sample", 0);
|
|
||||||
m_sceneShader->setUniform("displaySize", QVector2D(displayWidth(), displayHeight()));
|
|
||||||
m_sceneShader->setUniform("debug", debug ? 1 : 0);
|
|
||||||
m_sceneShader->unbind();
|
|
||||||
kDebug(1212) << "Scene Shader is valid";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
delete m_sceneShader;
|
|
||||||
m_sceneShader = NULL;
|
|
||||||
kDebug(1212) << "Scene Shader is not valid";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
m_genericSceneShader = new GLShader( ":/resources/scene-generic-vertex.glsl", ":/resources/scene-fragment.glsl" );
|
|
||||||
if (m_genericSceneShader->isValid()) {
|
|
||||||
m_genericSceneShader->bind();
|
|
||||||
m_genericSceneShader->setUniform("sample", 0);
|
|
||||||
m_genericSceneShader->setUniform("debug", debug ? 1 : 0);
|
|
||||||
QMatrix4x4 projection;
|
|
||||||
float fovy = 60.0f;
|
|
||||||
float aspect = 1.0f;
|
|
||||||
float zNear = 0.1f;
|
|
||||||
float zFar = 100.0f;
|
|
||||||
float ymax = zNear * tan(fovy * M_PI / 360.0f);
|
|
||||||
float ymin = -ymax;
|
|
||||||
float xmin = ymin * aspect;
|
|
||||||
float xmax = ymax * aspect;
|
|
||||||
projection.frustum(xmin, xmax, ymin, ymax, zNear, zFar);
|
|
||||||
m_genericSceneShader->setUniform("projection", projection);
|
|
||||||
QMatrix4x4 modelview;
|
|
||||||
float scaleFactor = 1.1 * tan( fovy * M_PI / 360.0f )/ymax;
|
|
||||||
modelview.translate(xmin*scaleFactor, ymax*scaleFactor, -1.1);
|
|
||||||
modelview.scale((xmax-xmin)*scaleFactor/displayWidth(), -(ymax-ymin)*scaleFactor/displayHeight(), 0.001);
|
|
||||||
m_genericSceneShader->setUniform("modelview", modelview);
|
|
||||||
m_genericSceneShader->unbind();
|
|
||||||
kDebug(1212) << "Generic Scene Shader is valid";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
delete m_genericSceneShader;
|
|
||||||
m_genericSceneShader = NULL;
|
|
||||||
delete m_sceneShader;
|
|
||||||
m_sceneShader = NULL;
|
|
||||||
kDebug(1212) << "Generic Scene Shader is not valid";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
m_colorShader = new GLShader(":/resources/scene-color-vertex.glsl", ":/resources/scene-color-fragment.glsl");
|
|
||||||
if (m_colorShader->isValid()) {
|
|
||||||
m_colorShader->bind();
|
|
||||||
m_colorShader->setUniform("displaySize", QVector2D(displayWidth(), displayHeight()));
|
|
||||||
m_colorShader->unbind();
|
|
||||||
kDebug(1212) << "Color Shader is valid";
|
|
||||||
} else {
|
|
||||||
delete m_genericSceneShader;
|
|
||||||
m_genericSceneShader = NULL;
|
|
||||||
delete m_sceneShader;
|
|
||||||
m_sceneShader = NULL;
|
|
||||||
delete m_colorShader;
|
|
||||||
m_colorShader = NULL;
|
|
||||||
kDebug(1212) << "Color Scene Shader is not valid";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SceneOpenGL::initFailed() const
|
bool SceneOpenGL::initFailed() const
|
||||||
{
|
{
|
||||||
return !init_ok;
|
return !init_ok;
|
||||||
|
@ -338,11 +269,6 @@ void SceneOpenGL::windowOpacityChanged( Toplevel* )
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
GLShader* SceneOpenGL::sceneShader() const
|
|
||||||
{
|
|
||||||
return m_sceneShader;
|
|
||||||
}
|
|
||||||
|
|
||||||
//****************************************
|
//****************************************
|
||||||
// SceneOpenGL::Texture
|
// SceneOpenGL::Texture
|
||||||
//****************************************
|
//****************************************
|
||||||
|
@ -528,14 +454,12 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat
|
||||||
int y = toplevel->y();
|
int y = toplevel->y();
|
||||||
double z = 0.0;
|
double z = 0.0;
|
||||||
bool sceneShader = false;
|
bool sceneShader = false;
|
||||||
if (!data.shader && static_cast<SceneOpenGL*>(scene)->hasSceneShader()) {
|
if (!data.shader && ShaderManager::instance()->isValid()) {
|
||||||
// set the shader for uniform initialising in paint decoration
|
// set the shader for uniform initialising in paint decoration
|
||||||
if ((mask & PAINT_WINDOW_TRANSFORMED) || (mask & PAINT_SCREEN_TRANSFORMED)) {
|
if ((mask & PAINT_WINDOW_TRANSFORMED) || (mask & PAINT_SCREEN_TRANSFORMED)) {
|
||||||
data.shader = static_cast<SceneOpenGL*>(scene)->m_genericSceneShader;
|
data.shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader);
|
||||||
data.shader->bind();
|
|
||||||
} else {
|
} else {
|
||||||
data.shader = static_cast<SceneOpenGL*>(scene)->m_sceneShader;
|
data.shader = ShaderManager::instance()->pushShader(ShaderManager::SimpleShader);
|
||||||
data.shader->bind();
|
|
||||||
data.shader->setUniform("geometry", QVector4D(x, y, toplevel->width(), toplevel->height()));
|
data.shader->setUniform("geometry", QVector4D(x, y, toplevel->width(), toplevel->height()));
|
||||||
}
|
}
|
||||||
sceneShader = true;
|
sceneShader = true;
|
||||||
|
@ -705,7 +629,7 @@ void SceneOpenGL::Window::performPaint( int mask, QRegion region, WindowPaintDat
|
||||||
|
|
||||||
if( sceneShader )
|
if( sceneShader )
|
||||||
{
|
{
|
||||||
data.shader->unbind();
|
ShaderManager::instance()->popShader();
|
||||||
data.shader = NULL;
|
data.shader = NULL;
|
||||||
}
|
}
|
||||||
#ifndef KWIN_HAVE_OPENGLES
|
#ifndef KWIN_HAVE_OPENGLES
|
||||||
|
@ -1212,14 +1136,16 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr
|
||||||
|
|
||||||
GLShader* shader = m_effectFrame->shader();
|
GLShader* shader = m_effectFrame->shader();
|
||||||
bool sceneShader = false;
|
bool sceneShader = false;
|
||||||
if( !shader && static_cast<SceneOpenGL*>(scene)->hasSceneShader() )
|
if( !shader && ShaderManager::instance()->isValid() )
|
||||||
{
|
{
|
||||||
shader = static_cast<SceneOpenGL*>(scene)->m_sceneShader;
|
shader = ShaderManager::instance()->pushShader(ShaderManager::SimpleShader);
|
||||||
sceneShader = true;
|
sceneShader = true;
|
||||||
}
|
}
|
||||||
if( shader )
|
if( shader )
|
||||||
{
|
{
|
||||||
shader->bind();
|
if (shader != ShaderManager::instance()->getBoundShader()) {
|
||||||
|
ShaderManager::instance()->pushShader(shader);
|
||||||
|
}
|
||||||
if( sceneShader )
|
if( sceneShader )
|
||||||
shader->setUniform("geometry", QVector4D(0, 0, 0, 0));
|
shader->setUniform("geometry", QVector4D(0, 0, 0, 0));
|
||||||
shader->setUniform("saturation", 1.0f);
|
shader->setUniform("saturation", 1.0f);
|
||||||
|
@ -1495,8 +1421,9 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr
|
||||||
m_textTexture->unbind();
|
m_textTexture->unbind();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( shader )
|
if (shader) {
|
||||||
shader->unbind();
|
ShaderManager::instance()->popShader();
|
||||||
|
}
|
||||||
glDisable( GL_BLEND );
|
glDisable( GL_BLEND );
|
||||||
#ifndef KWIN_HAVE_OPENGLES
|
#ifndef KWIN_HAVE_OPENGLES
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
|
@ -51,10 +51,6 @@ class SceneOpenGL
|
||||||
virtual void windowAdded( Toplevel* );
|
virtual void windowAdded( Toplevel* );
|
||||||
virtual void windowClosed( Toplevel*, Deleted* );
|
virtual void windowClosed( Toplevel*, Deleted* );
|
||||||
virtual void windowDeleted( Deleted* );
|
virtual void windowDeleted( Deleted* );
|
||||||
GLShader* sceneShader() const;
|
|
||||||
bool hasSceneShader() const {
|
|
||||||
return m_sceneShader != NULL && m_genericSceneShader != NULL && m_colorShader != NULL;
|
|
||||||
}
|
|
||||||
protected:
|
protected:
|
||||||
virtual void paintGenericScreen( int mask, ScreenPaintData data );
|
virtual void paintGenericScreen( int mask, ScreenPaintData data );
|
||||||
virtual void paintBackground( QRegion region );
|
virtual void paintBackground( QRegion region );
|
||||||
|
@ -72,7 +68,6 @@ class SceneOpenGL
|
||||||
bool selfCheck();
|
bool selfCheck();
|
||||||
void selfCheckSetup();
|
void selfCheckSetup();
|
||||||
bool selfCheckFinish();
|
bool selfCheckFinish();
|
||||||
bool setupSceneShaders();
|
|
||||||
GC gcroot;
|
GC gcroot;
|
||||||
class FBConfigInfo
|
class FBConfigInfo
|
||||||
{
|
{
|
||||||
|
@ -107,9 +102,6 @@ class SceneOpenGL
|
||||||
#endif
|
#endif
|
||||||
bool init_ok;
|
bool init_ok;
|
||||||
bool selfCheckDone;
|
bool selfCheckDone;
|
||||||
GLShader* m_sceneShader;
|
|
||||||
GLShader* m_genericSceneShader;
|
|
||||||
GLShader* m_colorShader;
|
|
||||||
bool debug;
|
bool debug;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,6 @@ SceneOpenGL::SceneOpenGL( Workspace* ws )
|
||||||
: Scene( ws )
|
: Scene( ws )
|
||||||
, init_ok( false )
|
, init_ok( false )
|
||||||
, selfCheckDone( true )
|
, selfCheckDone( true )
|
||||||
, m_sceneShader( NULL )
|
|
||||||
, m_genericSceneShader( NULL )
|
|
||||||
, m_colorShader( NULL )
|
|
||||||
{
|
{
|
||||||
if( !initRenderingContext() )
|
if( !initRenderingContext() )
|
||||||
return;
|
return;
|
||||||
|
@ -49,11 +46,11 @@ SceneOpenGL::SceneOpenGL( Workspace* ws )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
debug = qstrcmp( qgetenv( "KWIN_GL_DEBUG" ), "1" ) == 0;
|
debug = qstrcmp( qgetenv( "KWIN_GL_DEBUG" ), "1" ) == 0;
|
||||||
if (!setupSceneShaders()) {
|
if (!ShaderManager::instance()->isValid()) {
|
||||||
kError( 1212 ) << "Shaders not valid, ES compositing not possible";
|
kError( 1212 ) << "Shaders not valid, ES compositing not possible";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
ShaderManager::instance()->pushShader(ShaderManager::SimpleShader);
|
||||||
|
|
||||||
if( checkGLError( "Init" ))
|
if( checkGLError( "Init" ))
|
||||||
{
|
{
|
||||||
|
@ -73,7 +70,6 @@ SceneOpenGL::~SceneOpenGL()
|
||||||
eglDestroySurface( dpy, surface );
|
eglDestroySurface( dpy, surface );
|
||||||
eglTerminate( dpy );
|
eglTerminate( dpy );
|
||||||
eglReleaseThread();
|
eglReleaseThread();
|
||||||
delete m_sceneShader;
|
|
||||||
SceneOpenGL::EffectFrame::cleanup();
|
SceneOpenGL::EffectFrame::cleanup();
|
||||||
checkGLError( "Cleanup" );
|
checkGLError( "Cleanup" );
|
||||||
}
|
}
|
||||||
|
@ -245,13 +241,18 @@ void SceneOpenGL::paintGenericScreen(int mask, ScreenPaintData data)
|
||||||
screenTransformation.translate(-data.rotation->xRotationPoint, -data.rotation->yRotationPoint, -data.rotation->zRotationPoint);
|
screenTransformation.translate(-data.rotation->xRotationPoint, -data.rotation->yRotationPoint, -data.rotation->zRotationPoint);
|
||||||
}
|
}
|
||||||
screenTransformation.scale(data.xScale, data.yScale, data.zScale);
|
screenTransformation.scale(data.xScale, data.yScale, data.zScale);
|
||||||
m_genericSceneShader->bind();
|
GLShader *shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader);
|
||||||
m_genericSceneShader->setUniform("screenTransformation", screenTransformation);
|
shader->setUniform("screenTransformation", screenTransformation);
|
||||||
} else if ((mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS) || (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS)) {
|
} else if ((mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS) || (mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS)) {
|
||||||
m_genericSceneShader->bind();
|
GLShader *shader = ShaderManager::instance()->pushShader(ShaderManager::GenericShader);
|
||||||
m_genericSceneShader->setUniform("screenTransformation", QMatrix4x4());
|
shader->setUniform("screenTransformation", QMatrix4x4());
|
||||||
}
|
}
|
||||||
Scene::paintGenericScreen(mask, data);
|
Scene::paintGenericScreen(mask, data);
|
||||||
|
if ((mask & PAINT_SCREEN_TRANSFORMED) ||
|
||||||
|
(mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS) ||
|
||||||
|
(mask & PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_WITHOUT_FULL_REPAINTS)) {
|
||||||
|
ShaderManager::instance()->popShader();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SceneOpenGL::paintBackground(QRegion region)
|
void SceneOpenGL::paintBackground(QRegion region)
|
||||||
|
@ -278,8 +279,9 @@ void SceneOpenGL::paintBackground(QRegion region)
|
||||||
vbo.setUseColor(true);
|
vbo.setUseColor(true);
|
||||||
vbo.setUseShader(true);
|
vbo.setUseShader(true);
|
||||||
vbo.setData(verts.count() / 2, 2, verts.data(), NULL);
|
vbo.setData(verts.count() / 2, 2, verts.data(), NULL);
|
||||||
m_colorShader->bind();
|
ShaderManager::instance()->pushShader(ShaderManager::ColorShader);
|
||||||
vbo.render(GL_TRIANGLES);
|
vbo.render(GL_TRIANGLES);
|
||||||
|
ShaderManager::instance()->popShader();
|
||||||
}
|
}
|
||||||
|
|
||||||
//****************************************
|
//****************************************
|
||||||
|
|
|
@ -39,9 +39,6 @@ SceneOpenGL::SceneOpenGL( Workspace* ws )
|
||||||
: Scene( ws )
|
: Scene( ws )
|
||||||
, init_ok( false )
|
, init_ok( false )
|
||||||
, selfCheckDone( false )
|
, selfCheckDone( false )
|
||||||
, m_sceneShader( NULL )
|
|
||||||
, m_genericSceneShader( NULL )
|
|
||||||
, m_colorShader( NULL )
|
|
||||||
{
|
{
|
||||||
if( !Extensions::glxAvailable())
|
if( !Extensions::glxAvailable())
|
||||||
{
|
{
|
||||||
|
@ -101,7 +98,9 @@ SceneOpenGL::SceneOpenGL( Workspace* ws )
|
||||||
GLPlatform::instance()->detect();
|
GLPlatform::instance()->detect();
|
||||||
if( GLPlatform::instance()->supports( GLSL ) )
|
if( GLPlatform::instance()->supports( GLSL ) )
|
||||||
{
|
{
|
||||||
setupSceneShaders();
|
if (!ShaderManager::instance()->isValid()) {
|
||||||
|
kDebug(1212) << "No Scene Shaders available";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenGL scene setup
|
// OpenGL scene setup
|
||||||
|
@ -179,7 +178,6 @@ SceneOpenGL::~SceneOpenGL()
|
||||||
glXDestroyPixmap( display(), last_pixmap );
|
glXDestroyPixmap( display(), last_pixmap );
|
||||||
glXDestroyContext( display(), ctxdrawable );
|
glXDestroyContext( display(), ctxdrawable );
|
||||||
}
|
}
|
||||||
delete m_sceneShader;
|
|
||||||
SceneOpenGL::EffectFrame::cleanup();
|
SceneOpenGL::EffectFrame::cleanup();
|
||||||
checkGLError( "Cleanup" );
|
checkGLError( "Cleanup" );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue