#ifndef DRMTAP_INTERNAL_H
#define DRMTAP_INTERNAL_H
#include <stdarg.h>
#include <pthread.h>
#include "drmtap.h"
struct drmtap_ctx {
int drm_fd;
char device_path[256];
char driver_name[64];
uint32_t crtc_id;
uint32_t cached_connector_count;
uint32_t cached_crtc_count;
char helper_path[512];
int helper_pid;
int helper_fd;
char error_msg[512];
pthread_mutex_t lock;
int debug;
#define DRMTAP_FAST_SLOTS 4
struct {
uint32_t fb_id;
uint32_t gem_handle;
int prime_fd;
void *mmap_ptr;
size_t mmap_size;
uint32_t width, height, stride;
uint32_t format;
uint64_t modifier;
} fast_slots[4];
uint32_t fast_plane_id;
uint32_t fast_last_fb_id;
int fast_initialized;
void *deswizzle_buf;
size_t deswizzle_buf_size;
uint32_t fb2_pitches[4];
uint32_t fb2_offsets[4];
int fb2_num_planes;
};
void drmtap_set_error(drmtap_ctx *ctx, const char *fmt, ...);
void drmtap_debug_log(drmtap_ctx *ctx, const char *fmt, ...);
typedef struct {
uint8_t cmd;
uint8_t _pad1[3];
uint32_t crtc_id;
} helper_cmd_grab_t;
#define HELPER_FLAG_HAS_DMABUF 0x01
typedef struct {
uint32_t width;
uint32_t height;
uint32_t stride;
uint32_t format;
uint32_t fb_id;
uint32_t data_size;
uint64_t modifier;
uint32_t seq;
uint64_t timestamp_ms;
uint32_t flags;
uint32_t _pad;
} helper_grab_wire_t;
typedef struct {
helper_grab_wire_t wire;
int dmabuf_fd;
} helper_grab_result_t;
int drmtap_helper_spawn(drmtap_ctx *ctx);
void drmtap_helper_stop(drmtap_ctx *ctx);
void drmtap_fast_cleanup(drmtap_ctx *ctx);
int drmtap_helper_grab(drmtap_ctx *ctx, helper_grab_result_t *result,
void *pixel_buf, size_t buf_size);
typedef struct {
int32_t x, y;
int32_t hot_x, hot_y;
uint32_t width, height;
uint32_t visible;
uint32_t data_size;
} helper_cursor_wire_t;
int drmtap_helper_get_cursor(drmtap_ctx *ctx, drmtap_cursor_info *cursor);
int drmtap_gpu_generic_match(const char *driver);
int drmtap_gpu_generic_process(drmtap_ctx *ctx, void *data,
uint32_t width, uint32_t height,
uint32_t stride, uint32_t format,
uint64_t modifier);
int drmtap_gpu_intel_match(const char *driver);
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);
int drmtap_gpu_amd_match(const char *driver);
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);
int drmtap_gpu_nvidia_match(const char *driver);
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);
int drmtap_gpu_egl_available(drmtap_ctx *ctx);
int drmtap_gpu_egl_convert(drmtap_ctx *ctx,
int dma_buf_fd,
uint32_t width, uint32_t height,
uint32_t stride, uint32_t fourcc,
uint64_t modifier,
void **out_data, size_t *out_size);
#endif