Changeset View
Changeset View
Standalone View
Standalone View
plugins/platforms/drm/egl_gbm_backend.cpp
Show First 20 Lines • Show All 249 Lines • ▼ Show 20 Line(s) | 245 | { | |||
---|---|---|---|---|---|
250 | ); | 250 | ); | ||
251 | if (it == m_outputs.end()) { | 251 | if (it == m_outputs.end()) { | ||
252 | return; | 252 | return; | ||
253 | } | 253 | } | ||
254 | cleanupOutput(*it); | 254 | cleanupOutput(*it); | ||
255 | m_outputs.erase(it); | 255 | m_outputs.erase(it); | ||
256 | } | 256 | } | ||
257 | 257 | | |||
258 | const char *vertexShader = R"SHADER( | | |||
259 | #version 130 | | |||
260 | uniform mat4 modelViewProjectionMatrix; | | |||
261 | uniform mat4 rotationMatrix; | | |||
262 | | ||||
263 | in vec2 vertex; | | |||
264 | in vec2 texCoord; | | |||
265 | | ||||
266 | out vec2 TexCoord; | | |||
267 | | ||||
268 | void main() { | | |||
269 | gl_Position = rotationMatrix * vec4(vertex.x, vertex.y, 0.0, 1.0); | | |||
270 | TexCoord = texCoord; | | |||
271 | } | | |||
272 | )SHADER"; | | |||
273 | | ||||
274 | const char *fragmentShader = R"SHADER( | | |||
275 | #version 130 | | |||
276 | uniform sampler2D sampler; | | |||
277 | | ||||
278 | in vec2 TexCoord; | | |||
279 | out vec4 fragColor; | | |||
280 | | ||||
281 | void main() { | | |||
282 | fragColor = texture(sampler, TexCoord); | | |||
283 | } | | |||
284 | )SHADER"; | | |||
285 | | ||||
286 | const float vertices[] = { | 258 | const float vertices[] = { | ||
287 | -1.0f, 1.0f, | 259 | -1.0f, 1.0f, | ||
288 | -1.0f, -1.0f, | 260 | -1.0f, -1.0f, | ||
289 | 1.0f, -1.0f, | 261 | 1.0f, -1.0f, | ||
290 | 262 | | |||
291 | -1.0f, 1.0f, | 263 | -1.0f, 1.0f, | ||
292 | 1.0f, -1.0f, | 264 | 1.0f, -1.0f, | ||
293 | 1.0f, 1.0f, | 265 | 1.0f, 1.0f, | ||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Line(s) | 307 | if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { | |||
337 | return false; | 309 | return false; | ||
338 | } | 310 | } | ||
339 | 311 | | |||
340 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | 312 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | ||
341 | GLRenderTarget::setKWinFramebuffer(0); | 313 | GLRenderTarget::setKWinFramebuffer(0); | ||
342 | return true; | 314 | return true; | ||
343 | } | 315 | } | ||
344 | 316 | | |||
345 | bool EglGbmBackend::initRenderTarget(Output &output) | 317 | void EglGbmBackend::initRenderTarget(Output &output) | ||
346 | { | 318 | { | ||
347 | if (output.render.shader) { | 319 | if (output.render.vbo) { | ||
348 | // Already initialized. | 320 | // Already initialized. | ||
349 | return true; | 321 | return; | ||
350 | } | | |||
351 | std::shared_ptr<GLShader> shader(ShaderManager::instance()->loadShaderFromCode(vertexShader, | | |||
352 | fragmentShader)); | | |||
353 | if (!shader) { | | |||
354 | qCWarning(KWIN_DRM) << "Error creating render shader."; | | |||
355 | return false; | | |||
356 | } | 322 | } | ||
357 | | ||||
358 | output.render.shader = shader; | | |||
359 | | ||||
360 | std::shared_ptr<GLVertexBuffer> vbo(new GLVertexBuffer(KWin::GLVertexBuffer::Static)); | 323 | std::shared_ptr<GLVertexBuffer> vbo(new GLVertexBuffer(KWin::GLVertexBuffer::Static)); | ||
361 | vbo->setData(6, 2, vertices, texCoords); | 324 | vbo->setData(6, 2, vertices, texCoords); | ||
362 | output.render.vbo = vbo; | 325 | output.render.vbo = vbo; | ||
363 | return true; | | |||
364 | } | 326 | } | ||
365 | 327 | | |||
366 | void EglGbmBackend::renderFramebufferToSurface(Output &output) | 328 | void EglGbmBackend::renderFramebufferToSurface(Output &output) | ||
367 | { | 329 | { | ||
368 | if (!output.render.framebuffer) { | 330 | if (!output.render.framebuffer) { | ||
369 | // No additional render target. | 331 | // No additional render target. | ||
370 | return; | 332 | return; | ||
371 | } | 333 | } | ||
372 | if (!initRenderTarget(output)) { | 334 | initRenderTarget(output); | ||
373 | return; | | |||
374 | } | | |||
375 | 335 | | |||
376 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | 336 | glBindFramebuffer(GL_FRAMEBUFFER, 0); | ||
377 | GLRenderTarget::setKWinFramebuffer(0); | 337 | GLRenderTarget::setKWinFramebuffer(0); | ||
378 | 338 | | |||
379 | const auto size = output.output->modeSize(); | 339 | const auto size = output.output->modeSize(); | ||
380 | glViewport(0, 0, size.width(), size.height()); | 340 | glViewport(0, 0, size.width(), size.height()); | ||
381 | 341 | | |||
382 | ShaderBinder binder(output.render.shader.get()); | 342 | auto shader = ShaderManager::instance()->pushShader(ShaderTrait::MapTexture); | ||
343 | | ||||
383 | QMatrix4x4 rotationMatrix; | 344 | QMatrix4x4 rotationMatrix; | ||
384 | rotationMatrix.rotate(output.output->rotation(), 0, 0, 1); | 345 | rotationMatrix.rotate(output.output->rotation(), 0, 0, 1); | ||
385 | output.render.shader->setUniform("rotationMatrix", rotationMatrix); | 346 | shader->setUniform(GLShader::ModelViewProjectionMatrix, rotationMatrix); | ||
386 | 347 | | |||
387 | glBindTexture(GL_TEXTURE_2D, output.render.texture); | 348 | glBindTexture(GL_TEXTURE_2D, output.render.texture); | ||
388 | output.render.vbo->render(GL_TRIANGLES); | 349 | output.render.vbo->render(GL_TRIANGLES); | ||
350 | ShaderManager::instance()->popShader(); | ||||
389 | } | 351 | } | ||
390 | 352 | | |||
391 | void EglGbmBackend::prepareRenderFramebuffer(const Output &output) const | 353 | void EglGbmBackend::prepareRenderFramebuffer(const Output &output) const | ||
392 | { | 354 | { | ||
393 | // When render.framebuffer is 0 we may just reset to the screen framebuffer. | 355 | // When render.framebuffer is 0 we may just reset to the screen framebuffer. | ||
394 | glBindFramebuffer(GL_FRAMEBUFFER, output.render.framebuffer); | 356 | glBindFramebuffer(GL_FRAMEBUFFER, output.render.framebuffer); | ||
395 | GLRenderTarget::setKWinFramebuffer(output.render.framebuffer); | 357 | GLRenderTarget::setKWinFramebuffer(output.render.framebuffer); | ||
396 | } | 358 | } | ||
▲ Show 20 Lines • Show All 221 Lines • Show Last 20 Lines |