* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "util/u_memory.h"
#include "util/u_sampler.h"
#include "util/u_format.h"
+#include "util/u_surface.h"
#include "vl/vl_csc.h"
res_tmpl.depth0 = 1;
res_tmpl.array_size = 1;
res_tmpl.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
- res_tmpl.usage = PIPE_USAGE_STATIC;
+ res_tmpl.usage = PIPE_USAGE_DEFAULT;
pipe_mutex_lock(dev->mutex);
+
+ if (!CheckSurfaceParams(pipe->screen, &res_tmpl))
+ goto err_unlock;
+
res = pipe->screen->resource_create(pipe->screen, &res_tmpl);
- if (!res) {
- pipe_mutex_unlock(dev->mutex);
- FREE(dev);
- FREE(vlsurface);
- return VDP_STATUS_ERROR;
- }
+ if (!res)
+ goto err_unlock;
vlVdpDefaultSamplerViewTemplate(&sv_templ, res);
vlsurface->sampler_view = pipe->create_sampler_view(pipe, res, &sv_templ);
- if (!vlsurface->sampler_view) {
- pipe_resource_reference(&res, NULL);
- pipe_mutex_unlock(dev->mutex);
- FREE(dev);
- return VDP_STATUS_ERROR;
- }
+ if (!vlsurface->sampler_view)
+ goto err_resource;
memset(&surf_templ, 0, sizeof(surf_templ));
surf_templ.format = res->format;
vlsurface->surface = pipe->create_surface(pipe, res, &surf_templ);
- if (!vlsurface->surface) {
- pipe_resource_reference(&res, NULL);
- pipe_mutex_unlock(dev->mutex);
- FREE(dev);
- return VDP_STATUS_ERROR;
- }
+ if (!vlsurface->surface)
+ goto err_resource;
*surface = vlAddDataHTAB(vlsurface);
- if (*surface == 0) {
- pipe_resource_reference(&res, NULL);
- pipe_mutex_unlock(dev->mutex);
- FREE(dev);
- return VDP_STATUS_ERROR;
- }
-
+ if (*surface == 0)
+ goto err_resource;
+
pipe_resource_reference(&res, NULL);
vl_compositor_init_state(&vlsurface->cstate, pipe);
pipe_mutex_unlock(dev->mutex);
return VDP_STATUS_OK;
+
+err_resource:
+ pipe_sampler_view_reference(&vlsurface->sampler_view, NULL);
+ pipe_surface_reference(&vlsurface->surface, NULL);
+ pipe_resource_reference(&res, NULL);
+err_unlock:
+ pipe_mutex_unlock(dev->mutex);
+ FREE(vlsurface);
+ return VDP_STATUS_ERROR;
}
/**
pipe_mutex_lock(vlsurface->device->mutex);
vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL);
+ if (!CheckSurfaceParams(context->screen, &res_tmpl))
+ goto error_resource;
+
res = context->screen->resource_create(context->screen, &res_tmpl);
if (!res)
goto error_resource;
vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL);
memset(&vtmpl, 0, sizeof(vtmpl));
vtmpl.buffer_format = format;
- vtmpl.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
+ vtmpl.chroma_format = FormatYCBCRToPipeChroma(source_ycbcr_format);
if (destination_rect) {
vtmpl.width = abs(destination_rect->x0-destination_rect->x1);
return VDP_STATUS_OK;
}
+
+struct pipe_resource *vlVdpOutputSurfaceGallium(VdpOutputSurface surface)
+{
+ vlVdpOutputSurface *vlsurface;
+
+ vlsurface = vlGetDataHTAB(surface);
+ if (!vlsurface || !vlsurface->surface)
+ return NULL;
+
+ pipe_mutex_lock(vlsurface->device->mutex);
+ vlVdpResolveDelayedRendering(vlsurface->device, NULL, NULL);
+ pipe_mutex_unlock(vlsurface->device->mutex);
+
+ return vlsurface->surface->texture;
+}