st/vdpau: fix default swizzle for Output/Bitmap samplers
authorChristian König <deathsimple@vodafone.de>
Mon, 27 Feb 2012 15:50:01 +0000 (16:50 +0100)
committerChristian König <deathsimple@vodafone.de>
Fri, 2 Mar 2012 12:14:22 +0000 (13:14 +0100)
Signed-off-by: Christian König <deathsimple@vodafone.de>
src/gallium/state_trackers/vdpau/bitmap.c
src/gallium/state_trackers/vdpau/device.c
src/gallium/state_trackers/vdpau/output.c
src/gallium/state_trackers/vdpau/vdpau_private.h

index 0b885c8af7c3516caeb0b7888dcbfe09d2a9bc4e..abd745ae1c66d346965e6ccaf5c6f0b95d683b27 100644 (file)
@@ -84,8 +84,7 @@ vlVdpBitmapSurfaceCreate(VdpDevice device,
       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);
    if (!vlsurface->sampler_view) {
       pipe_resource_reference(&res, NULL);
index 482b71e9a0d90be8d7f89a525936c101261a4e51..98106a1c70246d73d45e2c9e4549a00ae11f39a2 100644 (file)
@@ -239,6 +239,25 @@ vlVdpGetErrorString (VdpStatus status)
    }
 }
 
+void
+vlVdpDefaultSamplerViewTemplate(struct pipe_sampler_view *templ, struct pipe_resource *res)
+{
+   const struct util_format_description *desc;
+
+   memset(templ, 0, sizeof(*templ));
+   u_sampler_view_default_template(templ, res, res->format);
+
+   desc = util_format_description(res->format);
+   if (desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_0)
+      templ->swizzle_r = PIPE_SWIZZLE_ONE;
+   if (desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_0)
+      templ->swizzle_g = PIPE_SWIZZLE_ONE;
+   if (desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_0)
+      templ->swizzle_b = PIPE_SWIZZLE_ONE;
+   if (desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_0)
+      templ->swizzle_a = PIPE_SWIZZLE_ONE;
+}
+
 void
 vlVdpResolveDelayedRendering(vlVdpDevice *dev, struct pipe_surface *surface, struct u_rect *dirty_area)
 {
@@ -270,8 +289,7 @@ vlVdpResolveDelayedRendering(vlVdpDevice *dev, struct pipe_surface *surface, str
       struct pipe_resource *res = surface->texture;
       struct pipe_sampler_view sv_templ;
 
-      memset(&sv_templ, 0, sizeof(sv_templ));
-      u_sampler_view_default_template(&sv_templ, res, res->format);
+      vlVdpDefaultSamplerViewTemplate(&sv_templ, res);
       pipe_sampler_view_reference(&vlsurface->sampler_view,
          dev->context->create_sampler_view(dev->context, res, &sv_templ));
    }
index aa636bd656893dca176a05a12d080bca14cc1780..873edac496216e047b892b419221983f8fe03cad 100644 (file)
@@ -85,8 +85,7 @@ vlVdpOutputSurfaceCreate(VdpDevice device,
       return VDP_STATUS_ERROR;
    }
 
-   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);
    if (!vlsurface->sampler_view) {
       pipe_resource_reference(&res, NULL);
index ab2c4201e0fe747594842363218490e09d6c7745..b72a7d642fffad250f048d690d5e4f9ce00df1d4 100644 (file)
@@ -381,6 +381,8 @@ boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
 VdpDeviceCreateX11 vdp_imp_device_create_x11;
 VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
 
+void vlVdpDefaultSamplerViewTemplate(struct pipe_sampler_view *templ, struct pipe_resource *res);
+
 /* Delayed rendering funtionality */
 void vlVdpResolveDelayedRendering(vlVdpDevice *dev, struct pipe_surface *surface, struct u_rect *dirty_area);
 void vlVdpSave4DelayedRendering(vlVdpDevice *dev, VdpOutputSurface surface, struct vl_compositor_state *cstate);