rpcsx/hw/amdgpu/bridge/src/bridge.cpp

89 lines
1.9 KiB
C++
Raw Normal View History

2023-06-24 14:59:27 +02:00
#include "bridge.hpp"
#include <fcntl.h>
#include <new>
#include <sys/mman.h>
#include <unistd.h>
static int gShmFd = -1;
static constexpr std::size_t kShmSize = sizeof(amdgpu::bridge::BridgeHeader) +
(sizeof(std::uint64_t) * (1024 * 1024));
std::uint32_t amdgpu::bridge::expGpuPid = 0;
2023-06-24 14:59:27 +02:00
amdgpu::bridge::BridgeHeader *
amdgpu::bridge::createShmCommandBuffer(const char *name) {
if (gShmFd != -1) {
return nullptr;
}
2023-06-24 22:48:25 +02:00
// unlinkShm(name);
2023-06-24 14:59:27 +02:00
int fd = ::shm_open(name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (fd == -1) {
return nullptr;
}
if (ftruncate(fd, kShmSize) < 0) {
::close(fd);
return nullptr;
}
void *memory =
::mmap(nullptr, kShmSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (memory == MAP_FAILED) {
::close(fd);
return nullptr;
}
gShmFd = fd;
auto result = new (memory) amdgpu::bridge::BridgeHeader();
2023-07-06 18:16:25 +02:00
result->size =
(kShmSize - sizeof(amdgpu::bridge::BridgeHeader)) / sizeof(std::uint64_t);
2023-06-24 14:59:27 +02:00
return result;
}
amdgpu::bridge::BridgeHeader *
amdgpu::bridge::openShmCommandBuffer(const char *name) {
if (gShmFd != -1) {
return nullptr;
}
int fd = ::shm_open(name, O_RDWR, S_IRUSR | S_IWUSR);
if (fd == -1) {
return nullptr;
}
2023-06-24 22:48:25 +02:00
if (ftruncate(fd, kShmSize) < 0) {
::close(fd);
return nullptr;
}
2023-06-24 14:59:27 +02:00
void *memory =
::mmap(nullptr, kShmSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (memory == MAP_FAILED) {
::close(fd);
return nullptr;
}
gShmFd = fd;
return new (memory) amdgpu::bridge::BridgeHeader;
}
void amdgpu::bridge::destroyShmCommandBuffer(
amdgpu::bridge::BridgeHeader *buffer) {
if (gShmFd == -1) {
__builtin_trap();
}
buffer->~BridgeHeader();
::close(gShmFd);
gShmFd = -1;
::munmap(buffer, kShmSize);
}
void amdgpu::bridge::unlinkShm(const char *name) { ::shm_unlink(name); }