VdpGetProcAddress **get_proc_address)
{
struct pipe_screen *pscreen;
+ struct pipe_resource *res, res_tmpl;
+ struct pipe_sampler_view sv_tmpl;
vlVdpDevice *dev = NULL;
VdpStatus ret;
goto no_dev;
}
+ pipe_reference_init(&dev->reference, 1);
+
dev->vscreen = vl_screen_create(display, screen);
if (!dev->vscreen) {
ret = VDP_STATUS_RESOURCES;
}
pscreen = dev->vscreen->pscreen;
- dev->context = pscreen->context_create(pscreen, dev->vscreen);
+ dev->context = pscreen->context_create(pscreen, dev->vscreen, 0);
if (!dev->context) {
ret = VDP_STATUS_RESOURCES;
goto no_context;
goto no_context;
}
+ memset(&res_tmpl, 0, sizeof(res_tmpl));
+
+ res_tmpl.target = PIPE_TEXTURE_2D;
+ res_tmpl.format = PIPE_FORMAT_R8G8B8A8_UNORM;
+ res_tmpl.width0 = 1;
+ res_tmpl.height0 = 1;
+ res_tmpl.depth0 = 1;
+ res_tmpl.array_size = 1;
+ res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW;
+ res_tmpl.usage = PIPE_USAGE_DEFAULT;
+
+ if (!CheckSurfaceParams(pscreen, &res_tmpl)) {
+ ret = VDP_STATUS_NO_IMPLEMENTATION;
+ goto no_resource;
+ }
+
+ res = pscreen->resource_create(pscreen, &res_tmpl);
+ if (!res) {
+ ret = VDP_STATUS_RESOURCES;
+ goto no_resource;
+ }
+
+ memset(&sv_tmpl, 0, sizeof(sv_tmpl));
+ u_sampler_view_default_template(&sv_tmpl, res, res->format);
+
+ sv_tmpl.swizzle_r = PIPE_SWIZZLE_ONE;
+ sv_tmpl.swizzle_g = PIPE_SWIZZLE_ONE;
+ sv_tmpl.swizzle_b = PIPE_SWIZZLE_ONE;
+ sv_tmpl.swizzle_a = PIPE_SWIZZLE_ONE;
+
+ dev->dummy_sv = dev->context->create_sampler_view(dev->context, res, &sv_tmpl);
+ pipe_resource_reference(&res, NULL);
+ if (!dev->dummy_sv) {
+ ret = VDP_STATUS_RESOURCES;
+ goto no_resource;
+ }
+
*device = vlAddDataHTAB(dev);
if (*device == 0) {
ret = VDP_STATUS_ERROR;
return VDP_STATUS_OK;
no_handle:
+ pipe_sampler_view_reference(&dev->dummy_sv, NULL);
+no_resource:
dev->context->destroy(dev->context);
- /* Destroy vscreen */
no_context:
vl_screen_destroy(dev->vscreen);
no_vscreen:
/**
* Create a VdpPresentationQueueTarget for use with X11.
*/
-PUBLIC VdpStatus
+VdpStatus
vlVdpPresentationQueueTargetCreateX11(VdpDevice device, Drawable drawable,
VdpPresentationQueueTarget *target)
{
if (!pqt)
return VDP_STATUS_RESOURCES;
- pqt->device = dev;
+ DeviceReference(&pqt->device, dev);
pqt->drawable = drawable;
*target = vlAddDataHTAB(pqt);
return VDP_STATUS_INVALID_HANDLE;
vlRemoveDataHTAB(presentation_queue_target);
+ DeviceReference(&pqt->device, NULL);
FREE(pqt);
return VDP_STATUS_OK;
if (!dev)
return VDP_STATUS_INVALID_HANDLE;
+ vlRemoveDataHTAB(device);
+ DeviceReference(&dev, NULL);
+
+ return VDP_STATUS_OK;
+}
+
+/**
+ * Free a VdpDevice.
+ */
+void
+vlVdpDeviceFree(vlVdpDevice *dev)
+{
pipe_mutex_destroy(dev->mutex);
vl_compositor_cleanup(&dev->compositor);
+ pipe_sampler_view_reference(&dev->dummy_sv, NULL);
dev->context->destroy(dev->context);
vl_screen_destroy(dev->vscreen);
-
- vlRemoveDataHTAB(device);
FREE(dev);
vlDestroyHTAB();
-
- return VDP_STATUS_OK;
}
/**
if (!vlGetFuncFTAB(function_id, function_pointer))
return VDP_STATUS_INVALID_FUNC_ID;
- VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Got proc adress %p for id %d\n", *function_pointer, function_id);
+ VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Got proc address %p for id %d\n", *function_pointer, function_id);
return VDP_STATUS_OK;
}