#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>
#include "drmtap_internal.h"
#include "drmtap.h"
#define AMD_VENDOR 0x02
int drmtap_gpu_amd_match(const char *driver) {
if (!driver) {
return 0;
}
return (strcmp(driver, "amdgpu") == 0 || strcmp(driver, "radeon") == 0);
}
int drmtap_gpu_amd_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, "amd: linear framebuffer, no conversion");
return 0;
}
uint8_t vendor = (uint8_t)(modifier >> 56);
if (vendor == AMD_VENDOR) {
drmtap_debug_log(ctx, "amd: tiled 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);
if (ret == 0) {
memcpy(data, tmp, size);
}
free(tmp);
return ret;
}
drmtap_debug_log(ctx, "amd: non-AMD modifier 0x%lx, passing through",
(unsigned long)modifier);
return 0;
}