vmwgfx: vmw alpha cursor

git-svn-id: svn://kolibrios.org@4570 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2014-02-10 17:53:33 +00:00
parent 4130072f5a
commit 81e6529629
5 changed files with 147 additions and 97 deletions

View File

@ -62,6 +62,7 @@ NAME_SRC= \
../ttm/ttm_bo.c \
../ttm/ttm_bo_manager.c \
../ttm/ttm_execbuf_util.c \
../ttm/ttm_lock.c \
../ttm/ttm_memory.c \
../ttm/ttm_object.c \
../ttm/ttm_page_alloc.c \

View File

@ -98,19 +98,13 @@ u32_t __attribute__((externally_visible)) drvEntry(int action, char *cmdline)
if( cmdline && *cmdline )
parse_cmdline(cmdline, log);
if(!dbg_open(log))
if( *log && !dbg_open(log))
{
strcpy(log, "/tmp1/1/vmw.log");
// strcpy(log, "/RD/1/DRIVERS/VMW.log");
// strcpy(log, "/HD0/1/vmw.log");
if(!dbg_open(log))
{
printf("Can't open %s\nExit\n", log);
return 0;
};
}
dbgprintf(" vmw v3.12-rc6\n cmdline: %s\n", cmdline);
dbgprintf(" vmw v3.14-rc1\n cmdline: %s\n", cmdline);
cpu_detect();
dbgprintf("\ncache line size %d\n", x86_clflush_size);
@ -820,16 +814,10 @@ void print_hex_dump_bytes(const char *prefix_str, int prefix_type,
#include "vmwgfx_kms.h"
void kms_update();
//#define iowrite32(v, addr) writel((v), (addr))
//#include "bitmap.h"
extern struct drm_device *main_device;
@ -842,7 +830,6 @@ typedef struct
uint32_t hot_y;
struct list_head list;
// struct drm_i915_gem_object *cobj;
}cursor_t;
#define CURSOR_WIDTH 64
@ -893,6 +880,37 @@ static int count_connector_modes(struct drm_connector* connector)
return count;
};
static void __stdcall restore_cursor(int x, int y){};
static void disable_mouse(void) {};
static void __stdcall move_cursor_kms(cursor_t *cursor, int x, int y)
{
struct drm_crtc *crtc = os_display->crtc;
struct vmw_private *dev_priv = vmw_priv(crtc->dev);
struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
vmw_cursor_update_position(dev_priv, true, x,y);
};
static cursor_t* __stdcall select_cursor_kms(cursor_t *cursor)
{
struct vmw_private *dev_priv = vmw_priv(os_display->ddev);
cursor_t *old;
old = os_display->cursor;
os_display->cursor = cursor;
vmw_cursor_update_image(dev_priv, cursor->data,
64, 64, cursor->hot_x, cursor->hot_y);
// vmw_cursor_update_position(dev_priv, true,
// du->cursor_x + du->hotspot_x,
// du->cursor_y + du->hotspot_y);
return old;
};
int kms_init(struct drm_device *dev)
{
struct drm_connector *connector;
@ -943,27 +961,14 @@ int kms_init(struct drm_device *dev)
os_display->connector = connector;
os_display->crtc = crtc;
os_display->supported_modes = mode_count;
// os_display->update = kms_update;
// struct intel_crtc *intel_crtc = to_intel_crtc(os_display->crtc);
// list_for_each_entry(cursor, &os_display->cursors, list)
// {
// init_cursor(cursor);
// };
// os_display->restore_cursor(0,0);
// os_display->init_cursor = init_cursor;
// os_display->select_cursor = select_cursor_kms;
// os_display->show_cursor = NULL;
// os_display->move_cursor = move_cursor_kms;
// os_display->restore_cursor = restore_cursor;
// os_display->disable_mouse = disable_mouse;
// intel_crtc->cursor_x = os_display->width/2;
// intel_crtc->cursor_y = os_display->height/2;
// select_cursor_kms(os_display->cursor);
os_display->restore_cursor(0,0);
os_display->select_cursor = select_cursor_kms;
os_display->show_cursor = NULL;
os_display->move_cursor = move_cursor_kms;
os_display->restore_cursor = restore_cursor;
os_display->disable_mouse = disable_mouse;
select_cursor_kms(os_display->cursor);
};
safe_sti(ifl);

View File

@ -390,8 +390,6 @@ int vmw_3d_resource_inc(struct vmw_private *dev_priv,
{
int ret = 0;
ENTER();
mutex_lock(&dev_priv->release_mutex);
if (unlikely(dev_priv->num_3d_resources++ == 0)) {
ret = vmw_request_device(dev_priv);
@ -406,7 +404,6 @@ int vmw_3d_resource_inc(struct vmw_private *dev_priv,
}
mutex_unlock(&dev_priv->release_mutex);
LEAVE();
return ret;
}
@ -475,6 +472,33 @@ static void vmw_get_initial_size(struct vmw_private *dev_priv)
dev_priv->initial_height = height;
}
/**
* vmw_dma_select_mode - Determine how DMA mappings should be set up for this
* system.
*
* @dev_priv: Pointer to a struct vmw_private
*
* This functions tries to determine the IOMMU setup and what actions
* need to be taken by the driver to make system pages visible to the
* device.
* If this function decides that DMA is not possible, it returns -EINVAL.
* The driver may then try to disable features of the device that require
* DMA.
*/
static int vmw_dma_select_mode(struct vmw_private *dev_priv)
{
static const char *names[vmw_dma_map_max] = {
[vmw_dma_phys] = "Using physical TTM page addresses.",
[vmw_dma_alloc_coherent] = "Using coherent TTM pages.",
[vmw_dma_map_populate] = "Keeping DMA mappings.",
[vmw_dma_map_bind] = "Giving up DMA mappings early."};
dev_priv->map_mode = vmw_dma_phys;
DRM_INFO("DMA map mode: %s\n", names[dev_priv->map_mode]);
return 0;
}
/**
* vmw_dma_masks - set required page- and dma masks
*
@ -510,7 +534,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
enum vmw_res_type i;
bool refuse_dma = false;
ENTER();
dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
@ -564,11 +587,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
}
dev_priv->capabilities = vmw_read(dev_priv, SVGA_REG_CAPABILITIES);
// ret = vmw_dma_select_mode(dev_priv);
// if (unlikely(ret != 0)) {
// DRM_INFO("Restricting capabilities due to IOMMU setup.\n");
// refuse_dma = true;
// }
ret = vmw_dma_select_mode(dev_priv);
if (unlikely(ret != 0)) {
DRM_INFO("Restricting capabilities due to IOMMU setup.\n");
refuse_dma = true;
}
dev_priv->vram_size = vmw_read(dev_priv, SVGA_REG_VRAM_SIZE);
dev_priv->mmio_size = vmw_read(dev_priv, SVGA_REG_MEM_SIZE);
@ -927,7 +950,7 @@ static void vmw_lastclose(struct drm_device *dev)
static void vmw_master_init(struct vmw_master *vmaster)
{
// ttm_lock_init(&vmaster->lock);
ttm_lock_init(&vmaster->lock);
INIT_LIST_HEAD(&vmaster->fb_surf);
mutex_init(&vmaster->fb_surf_mutex);
}
@ -1176,14 +1199,12 @@ static int vmw_pm_prepare(struct device *kdev)
#endif
static struct drm_driver driver = {
.driver_features = DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
DRIVER_MODESET,
.load = vmw_driver_load,
// .unload = vmw_driver_unload,
// .firstopen = vmw_firstopen,
// .lastclose = vmw_lastclose,
// .unload = vmw_driver_unload,
// .lastclose = vmw_lastclose,
.irq_preinstall = vmw_irq_preinstall,
.irq_postinstall = vmw_irq_postinstall,
// .irq_uninstall = vmw_irq_uninstall,
@ -1193,11 +1214,6 @@ static struct drm_driver driver = {
// .disable_vblank = vmw_disable_vblank,
// .ioctls = vmw_ioctls,
// .num_ioctls = DRM_ARRAY_SIZE(vmw_ioctls),
// .dma_quiescent = NULL, /*vmw_dma_quiescent, */
// .master_create = vmw_master_create,
// .master_destroy = vmw_master_destroy,
// .master_set = vmw_master_set,
// .master_drop = vmw_master_drop,
.open = vmw_driver_open,
// .preclose = vmw_preclose,
// .postclose = vmw_postclose,
@ -1206,13 +1222,7 @@ static struct drm_driver driver = {
// .dumb_map_offset = vmw_dumb_map_offset,
// .dumb_destroy = vmw_dumb_destroy,
// .fops = &vmwgfx_driver_fops,
// .name = VMWGFX_DRIVER_NAME,
// .desc = VMWGFX_DRIVER_DESC,
// .date = VMWGFX_DRIVER_DATE,
// .major = VMWGFX_DRIVER_MAJOR,
// .minor = VMWGFX_DRIVER_MINOR,
// .patchlevel = VMWGFX_DRIVER_PATCHLEVEL
};
#if 0

View File

@ -234,7 +234,7 @@ static int vmw_fifo_wait_noirq(struct vmw_private *dev_priv,
{
int ret = 0;
unsigned long end_jiffies = GetTimerTicks() + timeout;
DEFINE_WAIT(__wait);
// DEFINE_WAIT(__wait);
DRM_INFO("Fifo wait noirq.\n");
@ -411,6 +411,8 @@ static void vmw_fifo_res_copy(struct vmw_fifo_state *fifo_state,
uint32_t *buffer = (fifo_state->dynamic_buffer != NULL) ?
fifo_state->dynamic_buffer : fifo_state->static_buffer;
ENTER();
if (bytes < chunk_size)
chunk_size = bytes;
@ -421,6 +423,8 @@ static void vmw_fifo_res_copy(struct vmw_fifo_state *fifo_state,
if (rest)
memcpy(fifo_mem + (min >> 2), buffer + (chunk_size >> 2),
rest);
LEAVE();
}
static void vmw_fifo_slow_copy(struct vmw_fifo_state *fifo_state,
@ -430,6 +434,7 @@ static void vmw_fifo_slow_copy(struct vmw_fifo_state *fifo_state,
{
uint32_t *buffer = (fifo_state->dynamic_buffer != NULL) ?
fifo_state->dynamic_buffer : fifo_state->static_buffer;
ENTER();
while (bytes > 0) {
iowrite32(*buffer++, fifo_mem + (next_cmd >> 2));
@ -441,6 +446,7 @@ static void vmw_fifo_slow_copy(struct vmw_fifo_state *fifo_state,
mb();
bytes -= sizeof(uint32_t);
}
LEAVE();
}
void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes)
@ -452,6 +458,8 @@ void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes)
uint32_t min = ioread32(fifo_mem + SVGA_FIFO_MIN);
bool reserveable = fifo_state->capabilities & SVGA_FIFO_CAP_RESERVE;
// ENTER();
BUG_ON((bytes & 3) != 0);
BUG_ON(bytes > fifo_state->reserved_size);
@ -487,6 +495,8 @@ void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes)
// up_write(&fifo_state->rwsem);
vmw_fifo_ping_host(dev_priv, SVGA_SYNC_GENERIC);
mutex_unlock(&fifo_state->fifo_mutex);
// LEAVE();
}
int vmw_fifo_send_fence(struct vmw_private *dev_priv, uint32_t *seqno)

View File

@ -40,7 +40,7 @@ struct vmw_clip_rect {
* Clip @num_rects number of @rects against @clip storing the
* results in @out_rects and the number of passed rects in @out_num.
*/
void vmw_clip_cliprects(struct drm_clip_rect *rects,
static void vmw_clip_cliprects(struct drm_clip_rect *rects,
int num_rects,
struct vmw_clip_rect clip,
SVGASignedRect *out_rects,
@ -80,7 +80,6 @@ void vmw_display_unit_cleanup(struct vmw_display_unit *du)
drm_connector_cleanup(&du->connector);
}
#if 0
/*
* Display Unit Cursor functions
*/
@ -95,6 +94,8 @@ int vmw_cursor_update_image(struct vmw_private *dev_priv,
} *cmd;
u32 image_size = width * height * 4;
u32 cmd_size = sizeof(*cmd) + image_size;
u32 *dst;
int i, j;
if (!image)
return -EINVAL;
@ -107,7 +108,17 @@ int vmw_cursor_update_image(struct vmw_private *dev_priv,
memset(cmd, 0, sizeof(*cmd));
memcpy(&cmd[1], image, image_size);
dst = (u32*)&cmd[1];
for(i = 0; i < 32; i++)
{
for(j = 0; j < 32; j++)
*dst++ = *image++;
for( ; j < 64; j++)
*dst++ = 0;
}
for(i = 0; i < 64*(64-32); i++)
*image++ = 0;
cmd->cmd = cpu_to_le32(SVGA_CMD_DEFINE_ALPHA_CURSOR);
cmd->cursor.id = cpu_to_le32(0);
@ -121,6 +132,7 @@ int vmw_cursor_update_image(struct vmw_private *dev_priv,
return 0;
}
#if 0
int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
struct vmw_dma_buffer *dmabuf,
u32 width, u32 height,
@ -156,7 +168,7 @@ err_unreserve:
return ret;
}
#endif
void vmw_cursor_update_position(struct vmw_private *dev_priv,
bool show, int x, int y)
@ -171,6 +183,7 @@ void vmw_cursor_update_position(struct vmw_private *dev_priv,
iowrite32(++count, fifo_mem + SVGA_FIFO_CURSOR_COUNT);
}
#if 0
int vmw_du_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
uint32_t handle, uint32_t width, uint32_t height)
{
@ -424,21 +437,17 @@ struct vmw_framebuffer_surface {
struct drm_master *master;
};
void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer)
static void vmw_framebuffer_surface_destroy(struct drm_framebuffer *framebuffer)
{
struct vmw_framebuffer_surface *vfbs =
vmw_framebuffer_to_vfbs(framebuffer);
// struct vmw_master *vmaster = vmw_master(vfbs->master);
struct vmw_master *vmaster = vmw_master(vfbs->master);
// mutex_lock(&vmaster->fb_surf_mutex);
// list_del(&vfbs->head);
// mutex_unlock(&vmaster->fb_surf_mutex);
mutex_lock(&vmaster->fb_surf_mutex);
list_del(&vfbs->head);
mutex_unlock(&vmaster->fb_surf_mutex);
// drm_master_put(&vfbs->master);
// drm_framebuffer_cleanup(framebuffer);
// vmw_surface_unreference(&vfbs->surface);
// ttm_base_object_unref(&vfbs->base.user_obj);
kfree(vfbs);
}
@ -590,29 +599,33 @@ out_free_tmp:
return ret;
}
int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
static int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
struct drm_file *file_priv,
unsigned flags, unsigned color,
struct drm_clip_rect *clips,
unsigned num_clips)
{
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
// struct vmw_master *vmaster = vmw_master(file_priv->master);
struct vmw_master *vmaster = vmw_master(file_priv->master);
struct vmw_framebuffer_surface *vfbs =
vmw_framebuffer_to_vfbs(framebuffer);
struct drm_clip_rect norect;
int ret, inc = 1;
// if (unlikely(vfbs->master != file_priv->master))
// return -EINVAL;
if (unlikely(vfbs->master != file_priv->master))
return -EINVAL;
/* Require ScreenObject support for 3D */
if (!dev_priv->sou_priv)
return -EINVAL;
// ret = ttm_read_lock(&vmaster->lock, true);
// if (unlikely(ret != 0))
// return ret;
drm_modeset_lock_all(dev_priv->dev);
ret = ttm_read_lock(&vmaster->lock, true);
if (unlikely(ret != 0)) {
drm_modeset_unlock_all(dev_priv->dev);
return ret;
}
if (!num_clips) {
num_clips = 1;
@ -629,7 +642,10 @@ int vmw_framebuffer_surface_dirty(struct drm_framebuffer *framebuffer,
flags, color,
clips, num_clips, inc, NULL);
// ttm_read_unlock(&vmaster->lock);
ttm_read_unlock(&vmaster->lock);
drm_modeset_unlock_all(dev_priv->dev);
return 0;
}
@ -649,7 +665,7 @@ static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
struct drm_device *dev = dev_priv->dev;
struct vmw_framebuffer_surface *vfbs;
enum SVGA3dSurfaceFormat format;
// struct vmw_master *vmaster = vmw_master(file_priv->master);
struct vmw_master *vmaster = vmw_master(file_priv->master);
int ret;
/* 3D is only supported on HWv8 hosts which supports screen objects */
@ -722,9 +738,9 @@ static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
vfbs->base.user_handle = mode_cmd->handle;
// vfbs->master = drm_master_get(file_priv->master);
// mutex_lock(&vmaster->fb_surf_mutex);
// list_add_tail(&vfbs->head, &vmaster->fb_surf);
// mutex_unlock(&vmaster->fb_surf_mutex);
mutex_lock(&vmaster->fb_surf_mutex);
list_add_tail(&vfbs->head, &vmaster->fb_surf);
mutex_unlock(&vmaster->fb_surf_mutex);
*out = &vfbs->base;
@ -755,7 +771,7 @@ struct vmw_framebuffer_dmabuf {
struct vmw_dma_buffer *buffer;
};
void vmw_framebuffer_dmabuf_destroy(struct drm_framebuffer *framebuffer)
static void vmw_framebuffer_dmabuf_destroy(struct drm_framebuffer *framebuffer)
{
struct vmw_framebuffer_dmabuf *vfbd =
vmw_framebuffer_to_vfbd(framebuffer);
@ -941,22 +957,26 @@ static int do_dmabuf_dirty_sou(struct drm_file *file_priv,
return ret;
}
int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
static int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
struct drm_file *file_priv,
unsigned flags, unsigned color,
struct drm_clip_rect *clips,
unsigned num_clips)
{
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
// struct vmw_master *vmaster = vmw_master(file_priv->master);
struct vmw_master *vmaster = vmw_master(file_priv->master);
struct vmw_framebuffer_dmabuf *vfbd =
vmw_framebuffer_to_vfbd(framebuffer);
struct drm_clip_rect norect;
int ret, increment = 1;
// ret = ttm_read_lock(&vmaster->lock, true);
// if (unlikely(ret != 0))
// return ret;
drm_modeset_lock_all(dev_priv->dev);
ret = ttm_read_lock(&vmaster->lock, true);
if (unlikely(ret != 0)) {
drm_modeset_unlock_all(dev_priv->dev);
return ret;
}
if (!num_clips) {
num_clips = 1;
@ -979,7 +999,10 @@ int vmw_framebuffer_dmabuf_dirty(struct drm_framebuffer *framebuffer,
clips, num_clips, increment, NULL);
}
// ttm_read_unlock(&vmaster->lock);
ttm_read_unlock(&vmaster->lock);
drm_modeset_unlock_all(dev_priv->dev);
return ret;
}
@ -1672,7 +1695,7 @@ void vmw_disable_vblank(struct drm_device *dev, int crtc)
* Small shared kms functions.
*/
int vmw_du_update_layout(struct vmw_private *dev_priv, unsigned num,
static int vmw_du_update_layout(struct vmw_private *dev_priv, unsigned num,
struct drm_vmw_rect *rects)
{
struct drm_device *dev = dev_priv->dev;
@ -1717,7 +1740,8 @@ int vmw_du_update_layout(struct vmw_private *dev_priv, unsigned num,
#if 0
int vmw_du_page_flip(struct drm_crtc *crtc,
struct drm_framebuffer *fb,
struct drm_pending_vblank_event *event)
struct drm_pending_vblank_event *event,
uint32_t page_flip_flags)
{
struct vmw_private *dev_priv = vmw_priv(crtc->dev);
struct drm_framebuffer *old_fb = crtc->fb;