#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdint.h>
#include "drmtap_internal.h"
#include "drmtap.h"
#define I915_MOD_X_TILED 0x0100000000000001ULL
#define I915_MOD_Y_TILED 0x0100000000000002ULL
#define I915_MOD_Yf_TILED 0x0100000000000003ULL
#define I915_MOD_Y_TILED_CCS 0x0100000000000005ULL
#define I915_MOD_Y_TILED_GEN12_RC_CCS 0x0100000000000006ULL
#define I915_MOD_Y_TILED_GEN12_MC_CCS 0x0100000000000007ULL
#define I915_MOD_Y_TILED_GEN12_RC_CCS_CC 0x0100000000000008ULL
int drmtap_gpu_intel_match(const char *driver) {
if (!driver) {
return 0;
}
return (strcmp(driver, "i915") == 0 || strcmp(driver, "xe") == 0);
}
int drmtap_gpu_intel_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, "intel: linear framebuffer, no conversion");
return 0;
}
if (modifier == I915_MOD_X_TILED || modifier == I915_MOD_Y_TILED ||
modifier == I915_MOD_Yf_TILED || modifier == I915_MOD_Y_TILED_CCS ||
modifier == I915_MOD_Y_TILED_GEN12_RC_CCS ||
modifier == I915_MOD_Y_TILED_GEN12_MC_CCS ||
modifier == I915_MOD_Y_TILED_GEN12_RC_CCS_CC) {
drmtap_debug_log(ctx, "intel: 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, size);
if (ret == 0) {
memcpy(data, tmp, size);
}
free(tmp);
return ret;
}
drmtap_debug_log(ctx, "intel: unknown modifier 0x%lx, passing through",
(unsigned long)modifier);
return 0;
}