 +    ID3D11DeviceContext_Map(picture->p_sys->context, (ID3D11Resource*)picture->p_sys->surface, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
 +    CommonUpdatePicture(picture, NULL, mappedResource.pData, mappedResource.RowPitch);
 +    ID3D11DeviceContext_Unmap(picture->p_sys->context,(ID3D11Resource*)picture->p_sys->surface, 0);
-+    return VLC_SUCCESS;
-+}
-+
-+static int DesktopCallback(vlc_object_t *object, char const *psz_cmd,
-+                            vlc_value_t oldval, vlc_value_t newval,
-+                            void *p_data)
-+{
-+    vout_display_t *vd = (vout_display_t *)object;
-+    vout_display_sys_t *sys = vd->sys;
-+    VLC_UNUSED(psz_cmd);
-+    VLC_UNUSED(oldval);
-+    VLC_UNUSED(p_data);
-+
-+    vlc_mutex_lock(&sys->lock);
-+    const bool ch_desktop = !sys->desktop_requested != !newval.b_bool;
-+    sys->ch_desktop |= ch_desktop;
-+    sys->desktop_requested = newval.b_bool;
-+    vlc_mutex_unlock(&sys->lock);
 +    return VLC_SUCCESS;
 +}
 diff --git a/modules/video_output/msw/events.c b/modules/video_output/msw/events.c

+    // TODO : subtitle support
+    info.subpicture_chromas = NULL;
+
+    vlc_mutex_init(&sys->lock);
+    sys->ch_desktop = false;
+    sys->desktop_requested = sys->use_desktop;
+
+    vlc_value_t val;
+    val.psz_string = _("Desktop");
+    var_Change(vd, "video-wallpaper", VLC_VAR_SETTEXT, &val, NULL);
+    var_AddCallback(vd, "video-wallpaper", DesktopCallback, NULL);
+
+    video_format_Clean(&vd->fmt);
+    video_format_Copy(&vd->fmt, &fmt);
+    vd->info = info;

+    Output.Texture = In.Texture;\
+    return Output;\
+  }\
+";
+
+static const char* globPixelShaderDefault = "\
+  Texture2D shaderTexture;\
+  SamplerState SampleType;\
+  \
+  struct PS_INPUT\
+  {\
+    float4 Position   : SV_POSITION;\
+    float2 Texture    : TEXCOORD0;\
+  };\
+  \
+  float4 PS( PS_INPUT In ) : SV_TARGET\
+  {\
+    return shaderTexture.Sample(SampleType, In.Texture);\
+  }\
+";
+
+static const char* globPixelShaderBiplanarYUV2RGB = "\
+  Texture2D shaderTextureY;\
+  Texture2D shaderTextureUV;\
+  SamplerState SampleType;\
+  \
+  struct PS_INPUT\
+  {\
+    float4 Position   : SV_POSITION;\
+    float2 Texture    : TEXCOORD0;\
+  };\
+  \
+  float4 PS( PS_INPUT In ) : SV_TARGET\
+  {\
+    float3 yuv;\
+    float4 rgba;\
+    yuv.x  = shaderTextureY.Sample(SampleType, In.Texture).x;\
+    yuv.yz = shaderTextureUV.Sample(SampleType, In.Texture).xy;\
+    yuv.x  = 1.164 * (yuv.x-0.0625);\
+    yuv.y  = yuv.y - 0.5;\
+    yuv.z  = yuv.z - 0.5;\
+    rgba.x = saturate(yuv.x + 1.596 * yuv.z);\
+    rgba.y = saturate(yuv.x - 0.813 * yuv.z - 0.391 * yuv.y);\
+    rgba.z = saturate(yuv.x + 2.018 * yuv.y);\
+    rgba.w = 1.0;\
+    return rgba;\
+  }\
+";
+
+static const char* globPixelShaderTriplanarYUV2RGB = "\
+  Texture2D shaderTextureY;\
+  Texture2D shaderTextureU;\
+  Texture2D shaderTextureV;\
+  SamplerState SampleType;\
+  \
+  struct PS_INPUT\
+  {\
+    float4 Position   : SV_POSITION;\
+    float2 Texture    : TEXCOORD0;\
+  };\
+  \
+  float4 PS( PS_INPUT In ) : SV_TARGET\
+  {\
+    float3 yuv;\
+    float4 rgba;\
+    yuv.x  = shaderTextureY.Sample(SampleType, In.Texture).x;\
+    yuv.y  = shaderTextureU.Sample(SampleType, In.Texture).x;\
+    yuv.z  = shaderTextureV.Sample(SampleType, In.Texture).x;\
+    yuv.x  = 1.164 * (yuv.x-0.0625);\
+    yuv.y  = yuv.y - 0.5;\
+    yuv.z  = yuv.z - 0.5;\
+    rgba.x = saturate(yuv.x + 1.596 * yuv.z);\
+    rgba.y = saturate(yuv.x - 0.813 * yuv.z - 0.391 * yuv.y);\
+    rgba.z = saturate(yuv.x + 2.018 * yuv.y);\
+    rgba.w = 1.0;\
+    return rgba;\
+  }\
+";
+
