diff --git a/plugins/platforms/drm/egl_gbm_backend.h b/plugins/platforms/drm/egl_gbm_backend.h --- a/plugins/platforms/drm/egl_gbm_backend.h +++ b/plugins/platforms/drm/egl_gbm_backend.h @@ -76,7 +76,6 @@ GLuint framebuffer = 0; GLuint texture = 0; std::shared_ptr vbo; - std::shared_ptr shader; } render; }; @@ -89,7 +88,7 @@ void setViewport(const Output &output) const; bool resetFramebuffer(Output &output); - bool initRenderTarget(Output &output); + void initRenderTarget(Output &output); void prepareRenderFramebuffer(const Output &output) const; void renderFramebufferToSurface(Output &output); diff --git a/plugins/platforms/drm/egl_gbm_backend.cpp b/plugins/platforms/drm/egl_gbm_backend.cpp --- a/plugins/platforms/drm/egl_gbm_backend.cpp +++ b/plugins/platforms/drm/egl_gbm_backend.cpp @@ -255,34 +255,6 @@ m_outputs.erase(it); } -const char *vertexShader = R"SHADER( - #version 130 - uniform mat4 modelViewProjectionMatrix; - uniform mat4 rotationMatrix; - - in vec2 vertex; - in vec2 texCoord; - - out vec2 TexCoord; - - void main() { - gl_Position = rotationMatrix * vec4(vertex.x, vertex.y, 0.0, 1.0); - TexCoord = texCoord; - } -)SHADER"; - -const char *fragmentShader = R"SHADER( - #version 130 - uniform sampler2D sampler; - - in vec2 TexCoord; - out vec4 fragColor; - - void main() { - fragColor = texture(sampler, TexCoord); - } -)SHADER"; - const float vertices[] = { -1.0f, 1.0f, -1.0f, -1.0f, @@ -342,50 +314,40 @@ return true; } -bool EglGbmBackend::initRenderTarget(Output &output) +void EglGbmBackend::initRenderTarget(Output &output) { - if (output.render.shader) { + if (output.render.vbo) { // Already initialized. - return true; - } - std::shared_ptr shader(ShaderManager::instance()->loadShaderFromCode(vertexShader, - fragmentShader)); - if (!shader) { - qCWarning(KWIN_DRM) << "Error creating render shader."; - return false; + return; } - - output.render.shader = shader; - std::shared_ptr vbo(new GLVertexBuffer(KWin::GLVertexBuffer::Static)); vbo->setData(6, 2, vertices, texCoords); output.render.vbo = vbo; - return true; } void EglGbmBackend::renderFramebufferToSurface(Output &output) { if (!output.render.framebuffer) { // No additional render target. return; } - if (!initRenderTarget(output)) { - return; - } + initRenderTarget(output); glBindFramebuffer(GL_FRAMEBUFFER, 0); GLRenderTarget::setKWinFramebuffer(0); const auto size = output.output->modeSize(); glViewport(0, 0, size.width(), size.height()); - ShaderBinder binder(output.render.shader.get()); + auto shader = ShaderManager::instance()->pushShader(ShaderTrait::MapTexture); + QMatrix4x4 rotationMatrix; rotationMatrix.rotate(output.output->rotation(), 0, 0, 1); - output.render.shader->setUniform("rotationMatrix", rotationMatrix); + shader->setUniform(GLShader::ModelViewProjectionMatrix, rotationMatrix); glBindTexture(GL_TEXTURE_2D, output.render.texture); output.render.vbo->render(GL_TRIANGLES); + ShaderManager::instance()->popShader(); } void EglGbmBackend::prepareRenderFramebuffer(const Output &output) const