Commit c8261a96 authored by Sinclair Yeh's avatar Sinclair Yeh Committed by Thomas Hellstrom

vmwgfx: Major KMS refactoring / cleanup in preparation of screen targets

Signed-off-by: default avatarSinclair Yeh <syeh@vmware.com>
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
parent 233826a7
/************************************************************************** /**************************************************************************
* *
* Copyright © 2009 VMware, Inc., Palo Alto, CA., USA * Copyright © 2009-2014 VMware, Inc., Palo Alto, CA., USA
* All Rights Reserved. * All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
...@@ -330,6 +330,17 @@ struct vmw_ctx_binding_state { ...@@ -330,6 +330,17 @@ struct vmw_ctx_binding_state {
struct vmw_ctx_binding shaders[SVGA3D_SHADERTYPE_MAX]; struct vmw_ctx_binding shaders[SVGA3D_SHADERTYPE_MAX];
}; };
/*
* enum vmw_display_unit_type - Describes the display unit
*/
enum vmw_display_unit_type {
vmw_du_invalid = 0,
vmw_du_legacy,
vmw_du_screen_object
};
struct vmw_sw_context{ struct vmw_sw_context{
struct drm_open_hash res_ht; struct drm_open_hash res_ht;
bool res_ht_initialized; bool res_ht_initialized;
...@@ -421,6 +432,7 @@ struct vmw_private { ...@@ -421,6 +432,7 @@ struct vmw_private {
*/ */
void *fb_info; void *fb_info;
enum vmw_display_unit_type active_display_unit;
struct vmw_legacy_display *ldu_priv; struct vmw_legacy_display *ldu_priv;
struct vmw_screen_object_display *sou_priv; struct vmw_screen_object_display *sou_priv;
struct vmw_overlay *overlay_priv; struct vmw_overlay *overlay_priv;
...@@ -844,8 +856,8 @@ extern void vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv, ...@@ -844,8 +856,8 @@ extern void vmw_execbuf_copy_fence_user(struct vmw_private *dev_priv,
extern irqreturn_t vmw_irq_handler(int irq, void *arg); extern irqreturn_t vmw_irq_handler(int irq, void *arg);
extern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy, extern int vmw_wait_seqno(struct vmw_private *dev_priv, bool lazy,
uint32_t seqno, bool interruptible, uint32_t seqno, bool interruptible,
unsigned long timeout); unsigned long timeout);
extern void vmw_irq_preinstall(struct drm_device *dev); extern void vmw_irq_preinstall(struct drm_device *dev);
extern int vmw_irq_postinstall(struct drm_device *dev); extern int vmw_irq_postinstall(struct drm_device *dev);
extern void vmw_irq_uninstall(struct drm_device *dev); extern void vmw_irq_uninstall(struct drm_device *dev);
...@@ -876,9 +888,9 @@ extern void vmw_generic_waiter_remove(struct vmw_private *dev_priv, ...@@ -876,9 +888,9 @@ extern void vmw_generic_waiter_remove(struct vmw_private *dev_priv,
extern void vmw_marker_queue_init(struct vmw_marker_queue *queue); extern void vmw_marker_queue_init(struct vmw_marker_queue *queue);
extern void vmw_marker_queue_takedown(struct vmw_marker_queue *queue); extern void vmw_marker_queue_takedown(struct vmw_marker_queue *queue);
extern int vmw_marker_push(struct vmw_marker_queue *queue, extern int vmw_marker_push(struct vmw_marker_queue *queue,
uint32_t seqno); uint32_t seqno);
extern int vmw_marker_pull(struct vmw_marker_queue *queue, extern int vmw_marker_pull(struct vmw_marker_queue *queue,
uint32_t signaled_seqno); uint32_t signaled_seqno);
extern int vmw_wait_lag(struct vmw_private *dev_priv, extern int vmw_wait_lag(struct vmw_private *dev_priv,
struct vmw_marker_queue *queue, uint32_t us); struct vmw_marker_queue *queue, uint32_t us);
......
...@@ -71,8 +71,8 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv) ...@@ -71,8 +71,8 @@ bool vmw_fifo_have_3d(struct vmw_private *dev_priv)
if (hwversion < SVGA3D_HWVERSION_WS8_B1) if (hwversion < SVGA3D_HWVERSION_WS8_B1)
return false; return false;
/* Non-Screen Object path does not support surfaces */ /* Legacy Display Unit does not support surfaces */
if (!dev_priv->sou_priv) if (dev_priv->active_display_unit == vmw_du_legacy)
return false; return false;
return true; return true;
......
This diff is collapsed.
/************************************************************************** /**************************************************************************
* *
* Copyright © 2009 VMware, Inc., Palo Alto, CA., USA * Copyright © 2009-2014 VMware, Inc., Palo Alto, CA., USA
* All Rights Reserved. * All Rights Reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
...@@ -32,11 +32,17 @@ ...@@ -32,11 +32,17 @@
#include <drm/drm_crtc_helper.h> #include <drm/drm_crtc_helper.h>
#include "vmwgfx_drv.h" #include "vmwgfx_drv.h"
#define VMWGFX_NUM_DISPLAY_UNITS 8 #define VMWGFX_NUM_DISPLAY_UNITS 8
#define vmw_framebuffer_to_vfb(x) \ #define vmw_framebuffer_to_vfb(x) \
container_of(x, struct vmw_framebuffer, base) container_of(x, struct vmw_framebuffer, base)
#define vmw_framebuffer_to_vfbs(x) \
container_of(x, struct vmw_framebuffer_surface, base.base)
#define vmw_framebuffer_to_vfbd(x) \
container_of(x, struct vmw_framebuffer_dmabuf, base.base)
/** /**
* Base class for framebuffers * Base class for framebuffers
...@@ -53,9 +59,36 @@ struct vmw_framebuffer { ...@@ -53,9 +59,36 @@ struct vmw_framebuffer {
uint32_t user_handle; uint32_t user_handle;
}; };
/*
* Clip rectangle
*/
struct vmw_clip_rect {
int x1, x2, y1, y2;
};
struct vmw_framebuffer_surface {
struct vmw_framebuffer base;
struct vmw_surface *surface;
struct vmw_dma_buffer *buffer;
struct list_head head;
struct drm_master *master;
};
#define vmw_crtc_to_du(x) \
container_of(x, struct vmw_display_unit, crtc) struct vmw_framebuffer_dmabuf {
struct vmw_framebuffer base;
struct vmw_dma_buffer *buffer;
};
/*
* Basic clip rect manipulation
*/
void vmw_clip_cliprects(struct drm_clip_rect *rects,
int num_rects,
struct vmw_clip_rect clip,
SVGASignedRect *out_rects,
int *out_num);
/* /*
* Basic cursor manipulation * Basic cursor manipulation
...@@ -120,11 +153,7 @@ struct vmw_display_unit { ...@@ -120,11 +153,7 @@ struct vmw_display_unit {
/* /*
* Shared display unit functions - vmwgfx_kms.c * Shared display unit functions - vmwgfx_kms.c
*/ */
void vmw_display_unit_cleanup(struct vmw_display_unit *du); void vmw_du_cleanup(struct vmw_display_unit *du);
int vmw_du_page_flip(struct drm_crtc *crtc,
struct drm_framebuffer *fb,
struct drm_pending_vblank_event *event,
uint32_t page_flip_flags);
void vmw_du_crtc_save(struct drm_crtc *crtc); void vmw_du_crtc_save(struct drm_crtc *crtc);
void vmw_du_crtc_restore(struct drm_crtc *crtc); void vmw_du_crtc_restore(struct drm_crtc *crtc);
void vmw_du_crtc_gamma_set(struct drm_crtc *crtc, void vmw_du_crtc_gamma_set(struct drm_crtc *crtc,
...@@ -148,20 +177,31 @@ int vmw_du_connector_set_property(struct drm_connector *connector, ...@@ -148,20 +177,31 @@ int vmw_du_connector_set_property(struct drm_connector *connector,
/* /*
* Legacy display unit functions - vmwgfx_ldu.c * Legacy display unit functions - vmwgfx_ldu.c
*/ */
int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv); int vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
int vmw_kms_close_legacy_display_system(struct vmw_private *dev_priv); int vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
int vmw_kms_ldu_do_dmabuf_dirty(struct vmw_private *dev_priv,
struct vmw_framebuffer *framebuffer,
unsigned flags, unsigned color,
struct drm_clip_rect *clips,
unsigned num_clips, int increment);
/* /*
* Screen Objects display functions - vmwgfx_scrn.c * Screen Objects display functions - vmwgfx_scrn.c
*/ */
int vmw_kms_init_screen_object_display(struct vmw_private *dev_priv); int vmw_kms_sou_init_display(struct vmw_private *dev_priv);
int vmw_kms_close_screen_object_display(struct vmw_private *dev_priv); int vmw_kms_sou_close_display(struct vmw_private *dev_priv);
int vmw_kms_sou_update_layout(struct vmw_private *dev_priv, unsigned num, int vmw_kms_sou_do_surface_dirty(struct vmw_private *dev_priv,
struct drm_vmw_rect *rects); struct drm_file *file_priv,
bool vmw_kms_screen_object_flippable(struct vmw_private *dev_priv, struct vmw_framebuffer *framebuffer,
struct drm_crtc *crtc); unsigned flags, unsigned color,
void vmw_kms_screen_object_update_implicit_fb(struct vmw_private *dev_priv, struct drm_clip_rect *clips,
struct drm_crtc *crtc); unsigned num_clips, int inc,
struct vmw_fence_obj **out_fence);
int vmw_kms_sou_do_dmabuf_dirty(struct drm_file *file_priv,
struct vmw_private *dev_priv,
struct vmw_framebuffer *framebuffer,
unsigned flags, unsigned color,
struct drm_clip_rect *clips,
unsigned num_clips, int increment,
struct vmw_fence_obj **out_fence);
#endif #endif
...@@ -57,7 +57,7 @@ struct vmw_legacy_display_unit { ...@@ -57,7 +57,7 @@ struct vmw_legacy_display_unit {
static void vmw_ldu_destroy(struct vmw_legacy_display_unit *ldu) static void vmw_ldu_destroy(struct vmw_legacy_display_unit *ldu)
{ {
list_del_init(&ldu->active); list_del_init(&ldu->active);
vmw_display_unit_cleanup(&ldu->base); vmw_du_cleanup(&ldu->base);
kfree(ldu); kfree(ldu);
} }
...@@ -386,7 +386,7 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit) ...@@ -386,7 +386,7 @@ static int vmw_ldu_init(struct vmw_private *dev_priv, unsigned unit)
return 0; return 0;
} }
int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv) int vmw_kms_ldu_init_display(struct vmw_private *dev_priv)
{ {
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
int i, ret; int i, ret;
...@@ -423,6 +423,10 @@ int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv) ...@@ -423,6 +423,10 @@ int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv)
else else
vmw_ldu_init(dev_priv, 0); vmw_ldu_init(dev_priv, 0);
dev_priv->active_display_unit = vmw_du_legacy;
DRM_INFO("Legacy Display Unit initialized\n");
return 0; return 0;
err_vblank_cleanup: err_vblank_cleanup:
...@@ -433,7 +437,7 @@ int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv) ...@@ -433,7 +437,7 @@ int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv)
return ret; return ret;
} }
int vmw_kms_close_legacy_display_system(struct vmw_private *dev_priv) int vmw_kms_ldu_close_display(struct vmw_private *dev_priv)
{ {
struct drm_device *dev = dev_priv->dev; struct drm_device *dev = dev_priv->dev;
...@@ -448,3 +452,38 @@ int vmw_kms_close_legacy_display_system(struct vmw_private *dev_priv) ...@@ -448,3 +452,38 @@ int vmw_kms_close_legacy_display_system(struct vmw_private *dev_priv)
return 0; return 0;
} }
int vmw_kms_ldu_do_dmabuf_dirty(struct vmw_private *dev_priv,
struct vmw_framebuffer *framebuffer,
unsigned flags, unsigned color,
struct drm_clip_rect *clips,
unsigned num_clips, int increment)
{
size_t fifo_size;
int i;
struct {
uint32_t header;
SVGAFifoCmdUpdate body;
} *cmd;
fifo_size = sizeof(*cmd) * num_clips;
cmd = vmw_fifo_reserve(dev_priv, fifo_size);
if (unlikely(cmd == NULL)) {
DRM_ERROR("Fifo reserve failed.\n");
return -ENOMEM;
}
memset(cmd, 0, fifo_size);
for (i = 0; i < num_clips; i++, clips += increment) {
cmd[i].header = cpu_to_le32(SVGA_CMD_UPDATE);
cmd[i].body.x = cpu_to_le32(clips->x1);
cmd[i].body.y = cpu_to_le32(clips->y1);
cmd[i].body.width = cpu_to_le32(clips->x2 - clips->x1);
cmd[i].body.height = cpu_to_le32(clips->y2 - clips->y1);
}
vmw_fifo_commit(dev_priv, fifo_size);
return 0;
}
...@@ -100,7 +100,7 @@ static int vmw_overlay_send_put(struct vmw_private *dev_priv, ...@@ -100,7 +100,7 @@ static int vmw_overlay_send_put(struct vmw_private *dev_priv,
{ {
struct vmw_escape_video_flush *flush; struct vmw_escape_video_flush *flush;
size_t fifo_size; size_t fifo_size;
bool have_so = dev_priv->sou_priv ? true : false; bool have_so = (dev_priv->active_display_unit == vmw_du_screen_object);
int i, num_items; int i, num_items;
SVGAGuestPtr ptr; SVGAGuestPtr ptr;
...@@ -231,7 +231,7 @@ static int vmw_overlay_move_buffer(struct vmw_private *dev_priv, ...@@ -231,7 +231,7 @@ static int vmw_overlay_move_buffer(struct vmw_private *dev_priv,
if (!pin) if (!pin)
return vmw_dmabuf_unpin(dev_priv, buf, inter); return vmw_dmabuf_unpin(dev_priv, buf, inter);
if (!dev_priv->sou_priv) if (dev_priv->active_display_unit == vmw_du_legacy)
return vmw_dmabuf_to_vram(dev_priv, buf, true, inter); return vmw_dmabuf_to_vram(dev_priv, buf, true, inter);
return vmw_dmabuf_to_vram_or_gmr(dev_priv, buf, true, inter); return vmw_dmabuf_to_vram_or_gmr(dev_priv, buf, true, inter);
...@@ -453,7 +453,7 @@ int vmw_overlay_pause_all(struct vmw_private *dev_priv) ...@@ -453,7 +453,7 @@ int vmw_overlay_pause_all(struct vmw_private *dev_priv)
static bool vmw_overlay_available(const struct vmw_private *dev_priv) static bool vmw_overlay_available(const struct vmw_private *dev_priv)
{ {
return (dev_priv->overlay_priv != NULL && return (dev_priv->overlay_priv != NULL &&
((dev_priv->fifo.capabilities & VMW_OVERLAY_CAP_MASK) == ((dev_priv->fifo.capabilities & VMW_OVERLAY_CAP_MASK) ==
VMW_OVERLAY_CAP_MASK)); VMW_OVERLAY_CAP_MASK));
} }
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment