#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>
#include "drmtap_internal.h"
#include "drmtap.h"
#define NV_VENDOR 0x10
int drmtap_gpu_nvidia_match(const char *driver) {
if (!driver) {
return 0;
}
return (strcmp(driver, "nvidia-drm") == 0 ||
strcmp(driver, "nvidia") == 0 ||
strcmp(driver, "nouveau") == 0);
}
int drmtap_gpu_nvidia_process(drmtap_ctx *ctx, void *data,
uint32_t width, uint32_t height,
uint32_t stride, uint32_t format,
uint64_t modifier) {
(void)format;
if (modifier == 0) {
drmtap_debug_log(ctx, "nvidia: linear framebuffer, no conversion");
return 0;
}
uint8_t vendor = (uint8_t)(modifier >> 56);
if (vendor == NV_VENDOR) {
drmtap_debug_log(ctx,
"nvidia: blocklinear modifier 0x%lx, CPU deswizzle",
(unsigned long)modifier);
size_t size = (size_t)stride * height;
void *tmp = malloc(size);
if (!tmp) {
return -ENOMEM;
}
int ret = drmtap_deswizzle(data, tmp, width, height,
stride, stride, modifier, size);
if (ret == 0) {
memcpy(data, tmp, size);
}
free(tmp);
return ret;
}
drmtap_debug_log(ctx, "nvidia: unknown modifier 0x%lx, passing through",
(unsigned long)modifier);
return 0;
}