summaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2023-11-24 10:54:21 +0000
committerGitHub <noreply@github.com>2023-11-24 10:54:21 +0000
commit2ebfd0c7456eff7e9c03d379d1dfbc611dc26672 (patch)
tree9fa0d65224283e717ef7a06bb60870a5d319e13e /src/protocols
parente40e486f61f2643578b9977b86f408799dbc75fd (diff)
renderer: Move to a full Hyprland GL rendering pipeline (#3920)
Also updates wlroots
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/Screencopy.cpp24
-rw-r--r--src/protocols/ToplevelExport.cpp62
2 files changed, 25 insertions, 61 deletions
diff --git a/src/protocols/Screencopy.cpp b/src/protocols/Screencopy.cpp
index 12170595..cff84fc5 100644
--- a/src/protocols/Screencopy.cpp
+++ b/src/protocols/Screencopy.cpp
@@ -448,25 +448,19 @@ bool CScreencopyProtocolManager::copyFrameDmabuf(SScreencopyFrame* frame) {
if (!sourceTex)
return false;
- float glMatrix[9];
- wlr_matrix_identity(glMatrix);
- wlr_matrix_translate(glMatrix, -frame->box.x, -frame->box.y);
- wlr_matrix_scale(glMatrix, frame->pMonitor->vecPixelSize.x, frame->pMonitor->vecPixelSize.y);
-
- if (!wlr_renderer_begin_with_buffer(g_pCompositor->m_sWLRRenderer, frame->buffer)) {
- Debug::log(ERR, "[sc] dmabuf: Client requested a copy to a buffer that failed to pass wlr_renderer_begin_with_buffer");
- wlr_texture_destroy(sourceTex);
+ CRegion fakeDamage = {0, 0, frame->box.width, frame->box.height};
+
+ if (!g_pHyprRenderer->beginRender(frame->pMonitor, fakeDamage, RENDER_MODE_TO_BUFFER, frame->buffer))
return false;
- }
- float color[] = {0, 0, 0, 0};
- wlr_renderer_clear(g_pCompositor->m_sWLRRenderer, color);
- // TODO: use hl render methods to use damage
- wlr_render_texture_with_matrix(g_pCompositor->m_sWLRRenderer, sourceTex, glMatrix, 1.0f);
+ CBox monbox = CBox{0, 0, frame->pMonitor->vecPixelSize.x, frame->pMonitor->vecPixelSize.y}.translate({-frame->box.x, -frame->box.y});
+ g_pHyprOpenGL->setMonitorTransformEnabled(false);
+ g_pHyprOpenGL->renderTexture(sourceTex, &monbox, 1);
+ g_pHyprOpenGL->setMonitorTransformEnabled(true);
- wlr_texture_destroy(sourceTex);
+ g_pHyprRenderer->endRender();
- wlr_renderer_end(g_pCompositor->m_sWLRRenderer);
+ wlr_texture_destroy(sourceTex);
return true;
}
diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp
index 3f442781..db602396 100644
--- a/src/protocols/ToplevelExport.cpp
+++ b/src/protocols/ToplevelExport.cpp
@@ -134,7 +134,8 @@ void CToplevelExportProtocolManager::removeFrame(SScreencopyFrame* frame, bool f
std::erase_if(m_vFramesAwaitingWrite, [&](const auto& other) { return other == frame; });
wl_resource_set_user_data(frame->resource, nullptr);
- wlr_buffer_unlock(frame->buffer);
+ if (frame->buffer && frame->buffer->n_locks > 0)
+ wlr_buffer_unlock(frame->buffer);
removeClient(frame->client, force);
m_lFrames.remove(*frame);
}
@@ -362,18 +363,14 @@ bool CToplevelExportProtocolManager::copyFrameShm(SScreencopyFrame* frame, times
const auto PMONITOR = g_pCompositor->getMonitorFromID(frame->pWindow->m_iMonitorID);
CRegion fakeDamage{0, 0, PMONITOR->vecPixelSize.x * 10, PMONITOR->vecPixelSize.y * 10};
- if (frame->overlayCursor)
- wlr_output_lock_software_cursors(PMONITOR->output, true);
-
- if (!wlr_output_attach_render(PMONITOR->output, nullptr)) {
- Debug::log(ERR, "[toplevel_export] Couldn't attach render");
+ if (!g_pHyprRenderer->beginRender(PMONITOR, fakeDamage, RENDER_MODE_FULL_FAKE)) {
wlr_buffer_end_data_ptr_access(frame->buffer);
- if (frame->overlayCursor)
- wlr_output_lock_software_cursors(PMONITOR->output, false);
return false;
}
- g_pHyprOpenGL->begin(PMONITOR, &fakeDamage, true);
+ if (frame->overlayCursor)
+ wlr_output_lock_software_cursors(PMONITOR->output, true);
+
g_pHyprOpenGL->clear(CColor(0, 0, 0, 1.0));
// render client at 0,0
@@ -381,46 +378,25 @@ bool CToplevelExportProtocolManager::copyFrameShm(SScreencopyFrame* frame, times
g_pHyprRenderer->renderWindow(frame->pWindow, PMONITOR, now, false, RENDER_PASS_ALL, true, true);
g_pHyprRenderer->m_bBlockSurfaceFeedback = false;
- if (frame->overlayCursor && wlr_renderer_begin(g_pCompositor->m_sWLRRenderer, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y)) {
- // hack le massive
- wlr_output_cursor* cursor;
- const auto OFFSET = frame->pWindow->m_vRealPosition.vec() - PMONITOR->vecPosition;
- wl_list_for_each(cursor, &PMONITOR->output->cursors, link) {
- if (!cursor->enabled || !cursor->visible || PMONITOR->output->hardware_cursor == cursor) {
- continue;
- }
- cursor->x -= OFFSET.x;
- cursor->y -= OFFSET.y;
- }
- wlr_output_render_software_cursors(PMONITOR->output, NULL);
- wl_list_for_each(cursor, &PMONITOR->output->cursors, link) {
- if (!cursor->enabled || !cursor->visible || PMONITOR->output->hardware_cursor == cursor) {
- continue;
- }
- cursor->x += OFFSET.x;
- cursor->y += OFFSET.y;
- }
- wlr_renderer_end(g_pCompositor->m_sWLRRenderer);
- }
+ if (frame->overlayCursor)
+ g_pHyprRenderer->renderSoftwareCursors(PMONITOR, fakeDamage, g_pInputManager->getMouseCoordsInternal() - frame->pWindow->m_vRealPosition.vec());
// copy pixels
const auto PFORMAT = gles2FromDRM(format);
if (!PFORMAT) {
Debug::log(ERR, "[toplevel_export] Cannot read pixels, unsupported format {:x}", (uintptr_t)PFORMAT);
- g_pHyprOpenGL->end();
+ g_pHyprRenderer->endRender();
wlr_buffer_end_data_ptr_access(frame->buffer);
if (frame->overlayCursor)
wlr_output_lock_software_cursors(PMONITOR->output, false);
return false;
}
- glBindFramebuffer(GL_FRAMEBUFFER, g_pHyprOpenGL->m_RenderData.pCurrentMonData->primaryFB.m_iFb);
+ g_pHyprOpenGL->m_RenderData.mainFB->bind();
glReadPixels(0, 0, frame->box.width, frame->box.height, PFORMAT->gl_format, PFORMAT->gl_type, data);
- g_pHyprOpenGL->end();
-
- wlr_output_rollback(PMONITOR->output);
+ g_pHyprRenderer->endRender();
wlr_buffer_end_data_ptr_access(frame->buffer);
@@ -431,14 +407,12 @@ bool CToplevelExportProtocolManager::copyFrameShm(SScreencopyFrame* frame, times
}
bool CToplevelExportProtocolManager::copyFrameDmabuf(SScreencopyFrame* frame, timespec* now) {
- if (!wlr_renderer_begin_with_buffer(g_pCompositor->m_sWLRRenderer, frame->buffer))
- return false;
-
const auto PMONITOR = g_pCompositor->getMonitorFromID(frame->pWindow->m_iMonitorID);
CRegion fakeDamage{0, 0, INT16_MAX, INT16_MAX};
- g_pHyprOpenGL->begin(PMONITOR, &fakeDamage, true);
+ if (!g_pHyprRenderer->beginRender(PMONITOR, fakeDamage, RENDER_MODE_TO_BUFFER, frame->buffer))
+ return false;
g_pHyprOpenGL->clear(CColor(0, 0, 0, 1.0));
@@ -446,14 +420,10 @@ bool CToplevelExportProtocolManager::copyFrameDmabuf(SScreencopyFrame* frame, ti
g_pHyprRenderer->renderWindow(frame->pWindow, PMONITOR, now, false, RENDER_PASS_ALL, true, true);
g_pHyprRenderer->m_bBlockSurfaceFeedback = false;
- g_pHyprOpenGL->bindWlrOutputFb();
-
- CBox monbox = {0, 0, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y};
- g_pHyprOpenGL->renderTexture(g_pHyprOpenGL->m_RenderData.pCurrentMonData->primaryFB.m_cTex, &monbox, 1.f);
-
- g_pHyprOpenGL->end();
+ if (frame->overlayCursor)
+ g_pHyprRenderer->renderSoftwareCursors(PMONITOR, fakeDamage, g_pInputManager->getMouseCoordsInternal() - frame->pWindow->m_vRealPosition.vec());
- wlr_renderer_end(g_pCompositor->m_sWLRRenderer);
+ g_pHyprRenderer->endRender();
return true;
}