vlsurface->device = dev;
memset(&res_tmpl, 0, sizeof(res_tmpl));
-
res_tmpl.target = PIPE_TEXTURE_2D;
res_tmpl.format = FormatRGBAToPipe(rgba_format);
res_tmpl.width0 = width;
res_tmpl.array_size = 1;
res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
res_tmpl.usage = frequently_accessed ? PIPE_USAGE_DYNAMIC : PIPE_USAGE_STATIC;
+
+ pipe_mutex_lock(dev->mutex);
res = pipe->screen->resource_create(pipe->screen, &res_tmpl);
if (!res) {
+ pipe_mutex_unlock(dev->mutex);
FREE(dev);
+ FREE(vlsurface);
return VDP_STATUS_RESOURCES;
}
- memset(&sv_templ, 0, sizeof(sv_templ));
- u_sampler_view_default_template(&sv_templ, res, res->format);
+ vlVdpDefaultSamplerViewTemplate(&sv_templ, res);
vlsurface->sampler_view = pipe->create_sampler_view(pipe, res, &sv_templ);
+
+ pipe_resource_reference(&res, NULL);
+ pipe_mutex_unlock(dev->mutex);
+
if (!vlsurface->sampler_view) {
- pipe_resource_reference(&res, NULL);
FREE(dev);
return VDP_STATUS_RESOURCES;
}
*surface = vlAddDataHTAB(vlsurface);
if (*surface == 0) {
- pipe_resource_reference(&res, NULL);
FREE(dev);
return VDP_STATUS_ERROR;
}
- pipe_resource_reference(&res, NULL);
-
return VDP_STATUS_OK;
}
if (!vlsurface)
return VDP_STATUS_INVALID_HANDLE;
- vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL);
-
+ pipe_mutex_lock(vlsurface->device->mutex);
pipe_sampler_view_reference(&vlsurface->sampler_view, NULL);
+ pipe_mutex_unlock(vlsurface->device->mutex);
vlRemoveDataHTAB(surface);
FREE(vlsurface);
uint32_t *width, uint32_t *height,
VdpBool *frequently_accessed)
{
+ vlVdpBitmapSurface *vlsurface;
+ struct pipe_resource *res;
+
+ vlsurface = vlGetDataHTAB(surface);
+ if (!vlsurface)
+ return VDP_STATUS_INVALID_HANDLE;
+
if (!(rgba_format && width && height && frequently_accessed))
return VDP_STATUS_INVALID_POINTER;
- return VDP_STATUS_NO_IMPLEMENTATION;
+ res = vlsurface->sampler_view->texture;
+ *rgba_format = PipeToFormatRGBA(res->format);
+ *width = res->width0;
+ *height = res->height0;
+ *frequently_accessed = res->usage == PIPE_USAGE_DYNAMIC;
+
+ return VDP_STATUS_OK;
}
/**
uint32_t const *source_pitches,
VdpRect const *destination_rect)
{
- if (!(source_data && source_pitches && destination_rect))
+ vlVdpBitmapSurface *vlsurface;
+ struct pipe_box dst_box;
+ struct pipe_context *pipe;
+
+ vlsurface = vlGetDataHTAB(surface);
+ if (!vlsurface)
+ return VDP_STATUS_INVALID_HANDLE;
+
+ if (!(source_data && source_pitches))
return VDP_STATUS_INVALID_POINTER;
- return VDP_STATUS_NO_IMPLEMENTATION;
+ pipe = vlsurface->device->context;
+
+ pipe_mutex_lock(vlsurface->device->mutex);
+
+ vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL);
+
+ dst_box = RectToPipeBox(destination_rect, vlsurface->sampler_view->texture);
+ pipe->transfer_inline_write(pipe, vlsurface->sampler_view->texture, 0,
+ PIPE_TRANSFER_WRITE, &dst_box, *source_data,
+ *source_pitches, 0);
+
+ pipe_mutex_unlock(vlsurface->device->mutex);
+
+ return VDP_STATUS_OK;
}