Files
test/intern/cycles/session/display_driver.cpp
Brecht Van Lommel afad355060 Fix: Properly free Vulkan interop handle for Cycles
Unlike OpenGL and Metal, this handle is not shared, but rather Cycles
has to take ownership of it. This required a fair amount of refactoring
to ensure the handle is closed, ownership is properly transferred, and
the handle is recreated once when the pixel buffer is modified.
2025-05-26 10:59:49 +02:00

87 lines
1.4 KiB
C++

/* SPDX-FileCopyrightText: 2021-2025 Blender Foundation
*
* SPDX-License-Identifier: Apache-2.0 */
#include "session/display_driver.h"
#ifdef _WIN32
# include "util/windows.h"
#else
# include <unistd.h>
#endif
CCL_NAMESPACE_BEGIN
GraphicsInteropBuffer::~GraphicsInteropBuffer()
{
clear();
}
void GraphicsInteropBuffer::assign(GraphicsInteropDevice::Type type, int64_t handle, size_t size)
{
clear();
type_ = type;
handle_ = handle;
own_handle_ = true;
size_ = size;
}
bool GraphicsInteropBuffer::is_empty() const
{
return handle_ == 0;
}
void GraphicsInteropBuffer::zero()
{
need_zero_ = true;
}
void GraphicsInteropBuffer::clear()
{
if (type_ == GraphicsInteropDevice::VULKAN && handle_ && own_handle_) {
#ifdef _WIN32
CloseHandle(HANDLE(handle_));
#else
close(handle_);
#endif
}
type_ = GraphicsInteropDevice::NONE;
handle_ = 0;
size_ = 0;
need_zero_ = false;
own_handle_ = false;
}
GraphicsInteropDevice::Type GraphicsInteropBuffer::get_type() const
{
return type_;
}
size_t GraphicsInteropBuffer::get_size() const
{
return size_;
}
bool GraphicsInteropBuffer::has_new_handle() const
{
return own_handle_;
}
bool GraphicsInteropBuffer::take_zero()
{
bool need_zero = need_zero_;
need_zero_ = false;
return need_zero;
}
int64_t GraphicsInteropBuffer::take_handle()
{
assert(own_handle_);
own_handle_ = false;
return handle_;
}
CCL_NAMESPACE_END