|
@@ -679,6 +679,10 @@ static int vmw_cmd_surface_copy_check(struct vmw_private *dev_priv,
|
|
|
&cmd->body.src.sid, NULL);
|
|
|
if (unlikely(ret != 0))
|
|
|
return ret;
|
|
|
+
|
|
|
+ if (sw_context->quirks & VMW_QUIRK_SCREENTARGET)
|
|
|
+ return 0;
|
|
|
+
|
|
|
return vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
|
|
|
user_surface_converter,
|
|
|
&cmd->body.dest.sid, NULL);
|
|
@@ -1260,6 +1264,9 @@ static int vmw_cmd_dma(struct vmw_private *dev_priv,
|
|
|
if (unlikely(suffix->maximumOffset > bo_size))
|
|
|
suffix->maximumOffset = bo_size;
|
|
|
|
|
|
+ if (sw_context->quirks & VMW_QUIRK_SCREENTARGET)
|
|
|
+ goto out_no_surface;
|
|
|
+
|
|
|
ret = vmw_cmd_res_check(dev_priv, sw_context, vmw_res_surface,
|
|
|
user_surface_converter, &cmd->dma.host.sid,
|
|
|
NULL);
|
|
@@ -2544,6 +2551,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
|
|
|
void *kernel_commands,
|
|
|
uint32_t command_size,
|
|
|
uint64_t throttle_us,
|
|
|
+ uint32_t quirks,
|
|
|
struct drm_vmw_fence_rep __user *user_fence_rep,
|
|
|
struct vmw_fence_obj **out_fence)
|
|
|
{
|
|
@@ -2598,6 +2606,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
|
|
|
sw_context->fp = vmw_fpriv(file_priv);
|
|
|
sw_context->cur_reloc = 0;
|
|
|
sw_context->cur_val_buf = 0;
|
|
|
+ sw_context->quirks = quirks;
|
|
|
INIT_LIST_HEAD(&sw_context->resource_list);
|
|
|
sw_context->cur_query_bo = dev_priv->pinned_bo;
|
|
|
sw_context->last_query_ctx = NULL;
|
|
@@ -2904,6 +2913,7 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
|
|
|
ret = vmw_execbuf_process(file_priv, dev_priv,
|
|
|
(void __user *)(unsigned long)arg->commands,
|
|
|
NULL, arg->command_size, arg->throttle_us,
|
|
|
+ 0,
|
|
|
(void __user *)(unsigned long)arg->fence_rep,
|
|
|
NULL);
|
|
|
ttm_read_unlock(&dev_priv->reservation_sem);
|