summaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
authorPppp1116 <pcaiadoguerreiro@gmail.com>2026-03-26 00:08:49 +0000
committerGitHub <noreply@github.com>2026-03-26 00:08:49 +0000
commit855b1cba40ab972dc7c03ccd76ff5aacbeed099d (patch)
treedaaa6cf286c6c8da833a3a286b861c380901cd36 /src/protocols
parent2e5e800e4b334240689df5a4c2c4607f751da908 (diff)
renderer: small fixes in OpenGL.cpp and OpenGL.hpp (#13842)
* render: add EGL error details to dmabuf query failures * linux-dmabuf: tighten plane modifier checks and feedback safety
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/LinuxDMABUF.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/protocols/LinuxDMABUF.cpp b/src/protocols/LinuxDMABUF.cpp
index 0a395a1f..5013fb99 100644
--- a/src/protocols/LinuxDMABUF.cpp
+++ b/src/protocols/LinuxDMABUF.cpp
@@ -166,7 +166,8 @@ CLinuxDMABUFParamsResource::CLinuxDMABUFParamsResource(UP<CZwpLinuxBufferParamsV
const uint64_t modifier = (sc<uint64_t>(modHi) << 32) | modLo;
- if (m_resource->version() >= 5 && m_attrs->modifier && m_attrs->modifier != modifier) {
+ const bool anyPlaneSet = std::ranges::any_of(m_attrs->fds, [](int planeFD) { return planeFD != -1; });
+ if (m_resource->version() >= 5 && anyPlaneSet && m_attrs->modifier != modifier) {
r->error(ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INVALID_FORMAT, "planes have different modifiers");
return;
}
@@ -268,7 +269,7 @@ bool CLinuxDMABUFParamsResource::commence() {
uint32_t handle = 0;
if (drmPrimeFDToHandle(PROTO::linuxDma->m_mainDeviceFD.get(), m_attrs->fds.at(i), &handle)) {
- LOGM(Log::ERR, "Failed to import dmabuf fd");
+ LOGM(Log::ERR, "Failed to import dmabuf fd {} on plane {}", m_attrs->fds.at(i), i);
return false;
}
@@ -311,10 +312,11 @@ bool CLinuxDMABUFParamsResource::verify() {
}
for (size_t i = 0; i < sc<size_t>(m_attrs->planes); ++i) {
- if (sc<uint64_t>(m_attrs->offsets.at(i)) + sc<uint64_t>(m_attrs->strides.at(i)) * m_attrs->size.y > UINT32_MAX) {
+ const auto computedSize = sc<uint64_t>(m_attrs->offsets.at(i)) + sc<uint64_t>(m_attrs->strides.at(i)) * m_attrs->size.y;
+ if (computedSize > UINT32_MAX) {
m_resource->error(ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS,
std::format("size overflow on plane {}: offset {} + stride {} * height {} = {}, overflows UINT32_MAX", i, sc<uint64_t>(m_attrs->offsets.at(i)),
- sc<uint64_t>(m_attrs->strides.at(i)), m_attrs->size.y, sc<uint64_t>(m_attrs->offsets.at(i)) + sc<uint64_t>(m_attrs->strides.at(i))));
+ sc<uint64_t>(m_attrs->strides.at(i)), m_attrs->size.y, computedSize));
return false;
}
}
@@ -349,7 +351,7 @@ void CLinuxDMABUFFeedbackResource::sendTranche(SDMABUFTranche& tranche) {
m_resource->sendTrancheFlags(sc<zwpLinuxDmabufFeedbackV1TrancheFlags>(tranche.flags));
wl_array indices = {
- .size = tranche.indices.size() * sizeof(tranche.indices.at(0)),
+ .size = tranche.indices.size() * sizeof(std::vector<uint16_t>::value_type),
.data = tranche.indices.data(),
};
m_resource->sendTrancheFormats(&indices);