diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index 65d6327..a4ea4e5 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -664,7 +664,7 @@ HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface)
 }
 
 static void convert_r32_float_r16_float(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out,
-                              unsigned int w, unsigned int h)
+                              unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source)
 {
     unsigned int x, y;
     const float *src_f;
@@ -681,7 +681,7 @@ static void convert_r32_float_r16_float(const BYTE *src, BYTE *dst, DWORD pitch_
 }
 
 static void convert_r5g6b5_x8r8g8b8(const BYTE *src, BYTE *dst,
-        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h)
+        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source)
 {
     static const unsigned char convert_5to8[] =
     {
@@ -721,7 +721,7 @@ static void convert_r5g6b5_x8r8g8b8(const BYTE *src, BYTE *dst,
 }
 
 static void convert_a8r8g8b8_x8r8g8b8(const BYTE *src, BYTE *dst,
-        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h)
+        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source)
 {
     unsigned int x, y;
 
@@ -745,7 +745,7 @@ static inline BYTE cliptobyte(int x)
 }
 
 static void convert_yuy2_x8r8g8b8(const BYTE *src, BYTE *dst,
-        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h)
+        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source)
 {
     unsigned int x, y;
     int c2, d, e, r2 = 0, g2 = 0, b2 = 0;
@@ -788,10 +788,109 @@ static void convert_yuy2_x8r8g8b8(const BYTE *src, BYTE *dst,
     }
 }
 
+static void convert_r8g8b8_dxt1(const BYTE *src, BYTE *dst,
+        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source)
+{
+    const struct wined3d_gl_info *gl_info;
+    struct wined3d_context *context;
+    context = context_acquire(source->resource.device, NULL);
+    gl_info = context->gl_info;
+    //GLint compressed;
+    GLuint tname[1];
+
+    ENTER_GL();
+    glGenTextures(1, tname);
+    checkGLcall("glGenTextures");
+    glBindTexture(GL_TEXTURE_2D, tname[0]);
+    checkGLcall("glBindTexture(GL_TEXTURE_2D, tname)");
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, w, h, 0, GL_BGR, GL_UNSIGNED_BYTE, src);
+    //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, &compressed);
+    GL_EXTCALL(glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, dst));
+    glDeleteTextures(1, &tname);
+    LEAVE_GL();
+    context_release(context);
+}
+
+static void convert_a1r5g5b5_dxt1(const BYTE *src, BYTE *dst,
+        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source)
+{
+    const struct wined3d_gl_info *gl_info;
+    struct wined3d_context *context;
+    context = context_acquire(source->resource.device, NULL);
+    gl_info = context->gl_info;
+    //GLint compressed;
+    GLuint tname[1];
+    
+    BYTE conv[w*h*4];
+    WORD color;
+    DWORD outcolor;
+    int i;
+    for (i=0;i<w*h;i++) {
+      color=src[i*2]+src[i*2+1]*256;
+      outcolor=(((color >> 15)&0x1)<<31) | (((color >> 10)&0x1F)<<19) | (((color >> 5)&0x1F)<<11) | (color&0x1F)<<3;
+      conv[i*4+2]=outcolor & 255;
+      outcolor>>=8;
+      conv[i*4+1]=outcolor & 255;
+      outcolor>>=8;
+      conv[i*4]=outcolor & 255;
+      outcolor>>=8;
+      conv[i*4+3]=outcolor & 255;
+    }
+    
+    ENTER_GL();
+    glGenTextures(1, tname);
+    checkGLcall("glGenTextures");
+    glBindTexture(GL_TEXTURE_2D, tname[0]);
+    checkGLcall("glBindTexture(GL_TEXTURE_2D, tname)");
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, conv);
+    //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, &compressed);
+    GL_EXTCALL(glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, dst));
+    glDeleteTextures(1, &tname);
+    LEAVE_GL();
+    context_release(context);
+}
+
+static void convert_x1r5g5b5_dxt1(const BYTE *src, BYTE *dst,
+        DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source)
+{
+    const struct wined3d_gl_info *gl_info;
+    struct wined3d_context *context;
+    context = context_acquire(source->resource.device, NULL);
+    gl_info = context->gl_info;
+    //GLint compressed;
+    GLuint tname[1];
+    
+    BYTE conv[w*h*3];
+    WORD color;
+    DWORD outcolor;
+    int i;
+    for (i=0;i<w*h;i++) {
+      color=src[i*2]+src[i*2+1]*256;
+      outcolor=(((color >> 10)&0x1F)<<19) | (((color >> 5)&0x1F)<<11) | (color&0x1F)<<3;
+      conv[i*3+2]=outcolor & 255;
+      outcolor>>=8;
+      conv[i*3+1]=outcolor & 255;
+      outcolor>>=8;
+      conv[i*3]=outcolor & 255;
+    }
+    
+    ENTER_GL();
+    glGenTextures(1, tname);
+    checkGLcall("glGenTextures");
+    glBindTexture(GL_TEXTURE_2D, tname[0]);
+    checkGLcall("glBindTexture(GL_TEXTURE_2D, tname)");
+    glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, conv);
+    //glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, &compressed);
+    GL_EXTCALL(glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, dst));
+    glDeleteTextures(1, &tname);
+    LEAVE_GL();
+    context_release(context);
+}
+
 struct d3dfmt_convertor_desc
 {
     enum wined3d_format_id from, to;
-    void (*convert)(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h);
+    void (*convert)(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h, IWineD3DSurfaceImpl *source);
 };
 
 static const struct d3dfmt_convertor_desc convertors[] =
@@ -800,6 +899,9 @@ static const struct d3dfmt_convertor_desc convertors[] =
     {WINED3DFMT_B5G6R5_UNORM,   WINED3DFMT_B8G8R8X8_UNORM,  convert_r5g6b5_x8r8g8b8},
     {WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_B8G8R8X8_UNORM,  convert_a8r8g8b8_x8r8g8b8},
     {WINED3DFMT_YUY2,           WINED3DFMT_B8G8R8X8_UNORM,  convert_yuy2_x8r8g8b8},
+    {WINED3DFMT_B8G8R8_UNORM,   WINED3DFMT_DXT1,            convert_r8g8b8_dxt1},
+    {WINED3DFMT_B5G5R5A1_UNORM, WINED3DFMT_DXT1,            convert_a1r5g5b5_dxt1},
+    {WINED3DFMT_B5G5R5X1_UNORM, WINED3DFMT_DXT1,            convert_x1r5g5b5_dxt1},
 };
 
 static inline const struct d3dfmt_convertor_desc *find_convertor(enum wined3d_format_id from, enum wined3d_format_id to)
@@ -869,7 +971,7 @@ static IWineD3DSurfaceImpl *surface_convert_format(IWineD3DSurfaceImpl *source,
     }
 
     conv->convert(lock_src.pBits, lock_dst.pBits, lock_src.Pitch, lock_dst.Pitch,
-                  source->currentDesc.Width, source->currentDesc.Height);
+                  source->currentDesc.Width, source->currentDesc.Height, source);
 
     IWineD3DSurface_Unmap(ret);
     IWineD3DSurface_Unmap((IWineD3DSurface *)source);
