From a2d05131f0515e5c53c12c26549f5be2ef7777e7 Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Wed, 23 May 2018 21:24:03 +0200 Subject: Implement draw columns --- surface.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'surface.c') diff --git a/surface.c b/surface.c index bb6766f..a54ca6f 100644 --- a/surface.c +++ b/surface.c @@ -89,6 +89,45 @@ long copy_rects(struct file *filp, unsigned long arg) return param->rects_num; } +long draw_columns(struct file *filp, unsigned long arg) +{ + struct doomdev_surf_ioctl_draw_columns *param; + struct surface_data *surface_data; + struct texture_data *texture_data; + struct doomdev_column *columns; + struct fd texture_fds; + int i; + + surface_data = filp->private_data; + + param = (struct doomdev_surf_ioctl_draw_columns *) arg; + + // temp + if (param->draw_flags & DOOMDEV_DRAW_FLAGS_FUZZ) { + return 0x400; + } + + texture_fds = fdget(param->texture_fd); + texture_data = texture_fds.file->private_data; + + if (surface_data->doom_data != texture_data->doom_data) { + p("texture from different device\n"); + return -EINVAL; + } + + columns = (struct doomdev_column *) param->columns_ptr; + + mutex_lock(&surface_data->doom_data->cmd_mutex); + + for (i = 0; i < param->columns_num; i++) { + draw_column(surface_data, texture_data, columns[i]); + } + + mutex_unlock(&surface_data->doom_data->cmd_mutex); + + return param->columns_num; +} + long surface_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { switch (cmd) { @@ -98,6 +137,8 @@ long surface_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) return fill_rects(filp, arg); case DOOMDEV_SURF_IOCTL_COPY_RECTS: return copy_rects(filp, arg); + case DOOMDEV_SURF_IOCTL_DRAW_COLUMNS: + return draw_columns(filp, arg); default: return -1; } @@ -165,7 +206,7 @@ loff_t surface_llseek(struct file *filp, loff_t offset, int origin) void free_surface_buffer(struct surface_data *surface_data); -int surface_release (struct inode *inode, struct file *filp) +int surface_release(struct inode *inode, struct file *filp) { struct surface_data *surface_data; -- cgit v1.2.3