drm: allow multigpu blit from explicit to implicit (#114)

This commit is contained in:
Ikalco 2024-12-09 15:14:39 -06:00 committed by GitHub
parent 1af9816244
commit 9fc2d8e1fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 8 additions and 11 deletions

View file

@ -103,12 +103,14 @@ Aquamarine::CGBMBuffer::CGBMBuffer(const SAllocatorBufferParams& params, Hypruti
return;
}
bool foundFormat = false;
// check if we can use modifiers. If the requested support has any explicit modifier
// supported by the primary backend, we can.
for (auto const& f : FORMATS) {
if (f.drmFormat != attrs.format)
continue;
foundFormat = true;
for (auto const& m : f.modifiers) {
if (m == DRM_FORMAT_MOD_INVALID)
continue;
@ -134,17 +136,17 @@ Aquamarine::CGBMBuffer::CGBMBuffer(const SAllocatorBufferParams& params, Hypruti
}
}
if (!foundFormat) {
allocator->backend->log(AQ_LOG_ERROR, std::format("GBM: Failed to allocate a GBM buffer: format {} isn't supported by primary backend", fourccToName(attrs.format)));
return;
}
// FIXME: Nvidia cannot render to linear buffers. What do?
if (MULTIGPU) {
allocator->backend->log(AQ_LOG_DEBUG, "GBM: Buffer is marked as multigpu, forcing linear");
explicitModifiers = {DRM_FORMAT_MOD_LINEAR};
}
if (explicitModifiers.empty()) {
// fall back to using a linear buffer.
explicitModifiers.push_back(DRM_FORMAT_MOD_LINEAR);
}
uint32_t flags = GBM_BO_USE_RENDERING;
if (params.scanout)
flags |= GBM_BO_USE_SCANOUT;

View file

@ -527,7 +527,7 @@ void Aquamarine::CDRMBackend::buildGlFormats(const std::vector<SGLFormat>& fmts)
std::vector<SDRMFormat> result;
for (auto const& fmt : fmts) {
if (fmt.external)
if (fmt.external && fmt.modifier != DRM_FORMAT_MOD_INVALID)
continue;
if (auto it = std::find_if(result.begin(), result.end(), [fmt](const auto& e) { return fmt.drmFormat == e.drmFormat; }); it != result.end()) {

View file

@ -809,11 +809,6 @@ bool CDRMRenderer::verifyDestinationDMABUF(const SDMABUFAttrs& attrs) {
if (fmt.modifier != attrs.modifier)
continue;
if (fmt.external) {
backend->log(AQ_LOG_ERROR, "EGL (verifyDestinationDMABUF): FAIL, format is external-only");
return false;
}
return true;
}