[D3D] Some addition and regression fixes

Lionel Ulmer lionel.ulmer at free.fr
Tue Jun 3 05:25:49 CDT 2003


Now that I am back home and have more games to test (not to speak about a
faster 3D rendering :-) ), I fixed most regressions introduced by the last
series of patch.

There is still one 'poblem' remaining with FIFA2002 + Mesa (FIFA2002 does
not work with the NVIDIA drivers). As it's terribly slow on my box, I did
not really investigate more.

Will see how many people will complain (ie if it's present in more games
than just FIFA2002) :-)

Changelog:
 - fix (stupid) regressions introduced by last series of patch
 - 24 bpp handling for lock / unlock code
 - some better checks for AlphaPixel value
 - better TRACEing to better catch threading problems
    
-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c	Mon Jun  2 22:26:33 2003
+++ dlls/ddraw/d3ddevice/mesa.c	Tue Jun  3 11:44:49 2003
@@ -126,8 +126,8 @@
 {
     IDirect3DDeviceGLImpl* glThis = (IDirect3DDeviceGLImpl*) This;
    
-    ENTER_GL();
     TRACE("glxMakeCurrent %p, %ld, %p\n",glThis->display,glThis->drawable, glThis->gl_context);
+    ENTER_GL();
     if (glXMakeCurrent(glThis->display, glThis->drawable, glThis->gl_context) == False) {
 	ERR("Error in setting current context (context %p drawable %ld)!\n",
 	    glThis->gl_context, glThis->drawable);
@@ -1066,6 +1066,11 @@
     IDirect3DDeviceGLImpl* glThis = (IDirect3DDeviceGLImpl*) This;
     int num_active_stages = 0;
 
+    /* I put the trace before the various locks... So as to better understand where locks occur :-) */
+    if (TRACE_ON(ddraw)) {
+        TRACE(" Vertex format : "); dump_flexible_vertex(d3dvtVertexType);
+    }
+
     /* This is to prevent 'thread contention' between a thread locking the device and another
        doing 3D display on it... */
     EnterCriticalSection(&(This->crit));   
@@ -1077,10 +1082,6 @@
 
     glThis->state = SURFACE_GL;
     
-    if (TRACE_ON(ddraw)) {
-        TRACE(" Vertex format : "); dump_flexible_vertex(d3dvtVertexType);
-    }
-
     /* Just a hack for now.. Will have to find better algorithm :-/ */
     if ((d3dvtVertexType & D3DFVF_POSITION_MASK) != D3DFVF_XYZ) {
         vertex_lighted = TRUE;
@@ -1898,6 +1899,7 @@
 		
 		if (glThis->current_bound_texture[stage] == NULL) {
 		    if (This->state_block.texture_stage_state[stage][D3DTSS_COLOROP - 1] != D3DTOP_DISABLE) {
+			TRACE(" enabling 2D texturing and");
 			glEnable(GL_TEXTURE_2D);
 		    }
 		}
@@ -1906,6 +1908,13 @@
 	    }
 
 	    glThis->current_bound_texture[stage] = This->current_texture[stage];
+	} else {
+	    if (glThis->current_bound_texture[stage] == NULL) {
+		TRACE(" displaying without texturing activated for stage %ld.\n", stage);
+	    } else {
+		TRACE(" using already bound texture id %d for stage %ld.\n",
+		      ((IDirect3DTextureGLImpl *) (glThis->current_bound_texture[stage])->tex_private)->tex_name, stage);
+	    }
 	}
 
 	/* If no texure valid for this stage, go out of the loop */
@@ -2515,6 +2524,8 @@
 {
     GLfloat height, width;
     GLfloat trans_mat[16];
+
+    TRACE("(%p)\n", This);
     
     width = This->surface->surface_desc.dwWidth;
     height = This->surface->surface_desc.dwHeight;
@@ -2549,6 +2560,8 @@
 d3ddevice_set_matrices(IDirect3DDeviceImpl *This, DWORD matrices,
 		       D3DMATRIX *world_mat, D3DMATRIX *view_mat, D3DMATRIX *proj_mat)
 {
+    TRACE("(%p,%08lx,%p,%p,%p)\n", This, matrices, world_mat, view_mat, proj_mat);
+    
     ENTER_GL();
     if ((matrices & (VIEWMAT_CHANGED|WORLDMAT_CHANGED)) != 0) {
         glMatrixMode(GL_MODELVIEW);
@@ -2660,7 +2673,10 @@
 {
     IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
     DWORD tex_mat, tex_stage;
-    if ((matrices & (VIEWMAT_CHANGED|WORLDMAT_CHANGED|PROJMAT_CHANGED)) != 0) {
+
+    TRACE("(%p,%08lx)\n", This, matrices);
+    
+    if (matrices & (VIEWMAT_CHANGED|WORLDMAT_CHANGED|PROJMAT_CHANGED)) {
         if (glThis->transform_state == GL_TRANSFORM_NORMAL) {
 	    /* This will force an update of the transform state at the next drawing. */
 	    glThis->transform_state = GL_TRANSFORM_NONE;
@@ -2737,24 +2753,34 @@
 	/* Note that here we cannot do 'optmizations' about the WriteOnly flag... Indeed, a game
 	   may only write to the device... But when we will blit it back to the screen, we need
 	   also to blit correctly the parts the application did not overwrite... */
-	
-	if ((This->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 16) &&
-	    (This->surface_desc.u4.ddpfPixelFormat.u2.dwRBitMask ==        0xF800) &&
-	    (This->surface_desc.u4.ddpfPixelFormat.u3.dwGBitMask ==        0x07E0) &&
-	    (This->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask ==        0x001F) &&
-	    (This->surface_desc.u4.ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000)) {
-	    buffer_type = GL_UNSIGNED_SHORT_5_6_5;
-	    buffer_color = GL_RGB;
-	} else if ((This->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 32) &&
-		   (This->surface_desc.u4.ddpfPixelFormat.u2.dwRBitMask ==        0x00FF0000) &&
-		   (This->surface_desc.u4.ddpfPixelFormat.u3.dwGBitMask ==        0x0000FF00) &&
-		   (This->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask ==        0x000000FF) &&
-		   (This->surface_desc.u4.ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000)) {
-	    buffer_type = GL_UNSIGNED_BYTE;
-	    buffer_color = GL_BGRA;
-	    glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
+
+	if (((This->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_RGB) != 0) &&
+	    (((This->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS) == 0) ||
+	     (This->surface_desc.u4.ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000))) {
+	    if ((This->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 16) &&
+		(This->surface_desc.u4.ddpfPixelFormat.u2.dwRBitMask == 0xF800) &&
+		(This->surface_desc.u4.ddpfPixelFormat.u3.dwGBitMask == 0x07E0) &&
+		(This->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask == 0x001F)) {
+		buffer_type = GL_UNSIGNED_SHORT_5_6_5;
+		buffer_color = GL_RGB;
+	    } else if ((This->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 24) &&
+		       (This->surface_desc.u4.ddpfPixelFormat.u2.dwRBitMask == 0xFF0000) &&
+		       (This->surface_desc.u4.ddpfPixelFormat.u3.dwGBitMask == 0x00FF00) &&
+		       (This->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask == 0x0000FF)) {
+		buffer_type = GL_UNSIGNED_BYTE;
+		buffer_color = GL_RGB;
+	    } else if ((This->surface_desc.u4.ddpfPixelFormat.u1.dwRGBBitCount == 32) &&
+		       (This->surface_desc.u4.ddpfPixelFormat.u2.dwRBitMask == 0x00FF0000) &&
+		       (This->surface_desc.u4.ddpfPixelFormat.u3.dwGBitMask == 0x0000FF00) &&
+		       (This->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask == 0x000000FF)) {
+		buffer_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+		buffer_color = GL_BGRA;
+	    } else {
+		ERR(" unsupported pixel format at device locking.\n");
+		return;
+	    }
 	} else {
-	    ERR(" unsupported pixel format at device locking.\n");
+	    ERR(" unsupported pixel format at device locking - alpha on frame buffer.\n");
 	    return;
 	}
 
@@ -2789,8 +2815,6 @@
 	    dst += This->surface_desc.u1.lPitch;
 	}
 
-	glPixelStorei(GL_PACK_SWAP_BYTES, FALSE);
-	
 	if (is_front)
 	    gl_d3d_dev->front_state = SURFACE_MEMORY;
 	else
@@ -2849,7 +2873,7 @@
 
     
     if (upload_surface_to_tex_memory_init(surf, 0, &gl_d3d_dev->current_internal_format,
-					  initial, FALSE, UNLOCK_TEX_SIZE, UNLOCK_TEX_SIZE) != D3D_OK) {
+					  initial, FALSE, UNLOCK_TEX_SIZE, UNLOCK_TEX_SIZE) != DD_OK) {
         ERR(" unsupported pixel format at frame buffer flush.\n");
 	return;
     }
@@ -2963,6 +2987,9 @@
     if ((This->lastlocktype & DDLOCK_READONLY) == 0) {
         if (is_front == TRUE) {
 	    GLenum prev_draw;
+
+	    TRACE(" flushing front buffer immediatly on screen.\n");
+	    
 	    ENTER_GL();
 	    glGetIntegerv(GL_DRAW_BUFFER, &prev_draw);
 	    glDrawBuffer(GL_FRONT);
@@ -3023,10 +3050,12 @@
     object->matrices_updated = d3ddevice_matrices_updated;
     object->flush_to_framebuffer = d3ddevice_flush_to_frame_buffer;
     
-    InitializeCriticalSection(&(object->crit));
-    
     TRACE(" creating OpenGL device for surface = %p, d3d = %p\n", surface, d3d);
 
+    InitializeCriticalSection(&(object->crit));
+
+    TRACE(" device critical section : %p\n", &(object->crit));
+    
     device_context = GetDC(surface->ddraw_owner->window);
     gl_object->display = get_display(device_context);
     gl_object->drawable = get_drawable(device_context);
--- dlls/ddraw_CVS/d3dlight.c	Sun Jun  1 20:56:09 2003
+++ dlls/ddraw/d3dlight.c	Tue Jun  3 00:28:13 2003
@@ -161,6 +161,9 @@
 
 static void activate(IDirect3DLightImpl* This) {
     IDirect3DLightGLImpl *glThis = (IDirect3DLightGLImpl *) This;
+
+    TRACE("(%p)\n", This);
+    
     ENTER_GL();
     update(This);
     /* If was not active, activate it */
@@ -173,6 +176,9 @@
 
 static void desactivate(IDirect3DLightImpl* This) {
     IDirect3DLightGLImpl *glThis = (IDirect3DLightGLImpl *) This;
+    
+    TRACE("(%p)\n", This);
+    
     ENTER_GL();
     /* If was not active, activate it */
     if ((glThis->parent.light.dwFlags & D3DLIGHT_ACTIVE) != 0) {
--- dlls/ddraw_CVS/d3dtexture.c	Mon Jun  2 22:26:33 2003
+++ dlls/ddraw/d3dtexture.c	Tue Jun  3 10:35:43 2003
@@ -266,10 +266,13 @@
 	    snoop_texture(surf_ptr);
 
 	    if (upload_surface_to_tex_memory_init(surf_ptr, surf_ptr->mipmap_level, &(gl_surf_ptr->current_internal_format),
-						  gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) == D3D_OK) {
+						  gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) == DD_OK) {
 	        upload_surface_to_tex_memory(NULL, 0, 0, &(gl_surf_ptr->surface_ptr));
 		upload_surface_to_tex_memory_release();
 		gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
+	    } else {
+		ERR("Problem for upload of texture %d (level = %d / initial done = %d).\n",
+		    gl_surf_ptr->tex_name, surf_ptr->mipmap_level, gl_surf_ptr->initial_upload_done);
 	    }
 	}
 	
@@ -302,6 +305,8 @@
 
     if (glThis->dirty_flag == SURFACE_GL) {
 	GLuint cur_tex;
+
+	TRACE(" flushing GL texture back to memory.\n");
 	
 	ENTER_GL();
 	glGetIntegerv(GL_TEXTURE_BINDING_2D, &cur_tex);
@@ -368,6 +373,10 @@
 		return DDERR_INVALIDPARAMS;
 	    }
 
+	    if ((width == 0) || (height == 0)) {
+		return DD_OK;
+	    }
+	    
 	    TRACE(" direct frame buffer => texture BltFast override.\n");
 	    
 	    ENTER_GL();
@@ -380,24 +389,29 @@
 		  (width == surf_ptr->surface_desc.dwWidth) && (height == surf_ptr->surface_desc.dwHeight))) {
 		/* If not 'full size' and the surface is dirty, first flush it to GL before doing the copy. */
 	        if (upload_surface_to_tex_memory_init(surf_ptr, surf_ptr->mipmap_level, &(gl_surf_ptr->current_internal_format),
-						      gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) != D3D_OK) {
+						      gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) == DD_OK) {
 		    upload_surface_to_tex_memory(NULL, 0, 0, &(gl_surf_ptr->surface_ptr));
 		    upload_surface_to_tex_memory_release();
 		    gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
 		} else {
+		    glBindTexture(GL_TEXTURE_2D, cur_tex);
+		    LEAVE_GL();
+		    ERR("Error at texture upload !\n");
 		    return DDERR_INVALIDPARAMS;
 		}
 	    }
 
 	    /* This is a hack and would need some clean-up :-) */
 	    if (gl_surf_ptr->initial_upload_done == FALSE) {
-		gl_surf_ptr->dirty_flag = SURFACE_MEMORY_DIRTY;
 		if (upload_surface_to_tex_memory_init(surf_ptr, surf_ptr->mipmap_level, &(gl_surf_ptr->current_internal_format),
-						       gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) != D3D_OK) {
+						      TRUE, TRUE, 0, 0) == DD_OK) {
 		    upload_surface_to_tex_memory(NULL, 0, 0, &(gl_surf_ptr->surface_ptr));
 		    upload_surface_to_tex_memory_release();
 		    gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
 		} else {
+		    glBindTexture(GL_TEXTURE_2D, cur_tex);
+		    LEAVE_GL();
+		    ERR("Error at texture upload (initial case) !\n");
 		    return DDERR_INVALIDPARAMS;
 		}
 	    }
@@ -490,6 +504,8 @@
     if (glThis->dirty_flag == SURFACE_GL) {
 	GLuint cur_tex;
 	
+	TRACE(" flushing GL texture back to memory.\n");
+	
 	ENTER_GL();
 	glGetIntegerv(GL_TEXTURE_BINDING_2D, &cur_tex);
 	glBindTexture(GL_TEXTURE_2D, glThis->tex_name);
@@ -836,18 +852,19 @@
 	   to save those... */
 	surf->aux_blt = gltex_blt;
 	surf->aux_bltfast = gltex_bltfast;
-
+	
+	TRACE(" GL texture created for surface %p (private data at %p)\n", surf, private);
+	
 	ENTER_GL();
 	if (surf->mipmap_level == 0) {
 	    glGenTextures(1, &(private->tex_name));
 	    if (private->tex_name == 0) ERR("Error at creation of OpenGL texture ID !\n");
-	    TRACE(" GL texture created for surface %p (private data at %p and GL id %d).\n", surf, private, private->tex_name);
+	    TRACE(" GL texture id is : %d.\n", private->tex_name);
 	    private->__global_dirty_flag = (at_creation == FALSE ? SURFACE_MEMORY_DIRTY : SURFACE_MEMORY);
 	    private->global_dirty_flag = &(private->__global_dirty_flag);
 	} else {
 	    private->tex_name = ((IDirect3DTextureGLImpl *) (main->tex_private))->tex_name;
-	    TRACE(" GL texture created for surface %p (private data at %p and GL id reusing id %d from surface %p (%p)).\n",
-		  surf, private, private->tex_name, main, main->tex_private);
+	    TRACE(" GL texture id reusing id %d from surface %p (private at %p)).\n", private->tex_name, main, main->tex_private);
 	    private->global_dirty_flag = &(((IDirect3DTextureGLImpl *) (main->tex_private))->__global_dirty_flag);
 	}
 	LEAVE_GL();
--- dlls/ddraw_CVS/mesa.c	Sun Jun  1 20:56:09 2003
+++ dlls/ddraw/mesa.c	Tue Jun  3 10:34:42 2003
@@ -88,8 +88,7 @@
     DWORD dwRenderState = lpStateBlock->render_state[dwRenderStateType - 1];
     IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
     
-    if (TRACE_ON(ddraw))
-        TRACE("%s = %08lx\n", _get_renderstate(dwRenderStateType), dwRenderState);
+    TRACE("%s = %08lx\n", _get_renderstate(dwRenderStateType), dwRenderState);
 
     /* First, all the stipple patterns */
     if ((dwRenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00) &&
@@ -635,169 +634,189 @@
 	   RGB Textures
 	   ************ */
 	if (src_pf->u1.dwRGBBitCount == 8) {
-	    if ((src_pf->u2.dwRBitMask == 0xE0) &&
-		(src_pf->u3.dwGBitMask == 0x1C) &&
-		(src_pf->u4.dwBBitMask == 0x03)) {
-		/* **********************
-		   GL_UNSIGNED_BYTE_3_3_2
-		   ********************** */
-		if (colorkey_active) {
-		    /* This texture format will never be used.. So do not care about color keying
-		       up until the point in time it will be needed :-) */
-		    FIXME(" ColorKeying not supported in the RGB 332 format !");
-		}
-		current_format = GL_RGB;
-		internal_format = GL_RGB;
-		current_pixel_format = GL_UNSIGNED_BYTE_3_3_2;
-		convert_type = NO_CONVERSION;
-	    } else {
+	    if ((src_pf->dwFlags & DDPF_ALPHAPIXELS) &&
+		(src_pf->u5.dwRGBAlphaBitMask != 0x00)) {
 		error = TRUE;
-	    }
-	} else if (src_pf->u1.dwRGBBitCount == 16) {
-	    if ((src_pf->u2.dwRBitMask ==        0xF800) &&
-		(src_pf->u3.dwGBitMask ==        0x07E0) &&
-		(src_pf->u4.dwBBitMask ==        0x001F) &&
-		(src_pf->u5.dwRGBAlphaBitMask == 0x0000)) {
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_565;
-		    current_format = GL_RGBA;
-		    internal_format = GL_RGBA;
-		    current_pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
-		} else {
-		    convert_type = NO_CONVERSION;
+	    } else {
+		if ((src_pf->u2.dwRBitMask == 0xE0) &&
+		    (src_pf->u3.dwGBitMask == 0x1C) &&
+		    (src_pf->u4.dwBBitMask == 0x03)) {
+		    /* **********************
+		       GL_UNSIGNED_BYTE_3_3_2
+		       ********************** */
+		    if (colorkey_active) {
+			/* This texture format will never be used.. So do not care about color keying
+			   up until the point in time it will be needed :-) */
+			FIXME(" ColorKeying not supported in the RGB 332 format !");
+		    }
 		    current_format = GL_RGB;
 		    internal_format = GL_RGB;
-		    current_pixel_format = GL_UNSIGNED_SHORT_5_6_5;
-		}
-	    } else if ((src_pf->u2.dwRBitMask ==        0xF800) &&
-		       (src_pf->u3.dwGBitMask ==        0x07C0) &&
-		       (src_pf->u4.dwBBitMask ==        0x003E) &&
-		       (src_pf->u5.dwRGBAlphaBitMask == 0x0001)) {
-		current_format = GL_RGBA;
-		internal_format = GL_RGBA;
-		current_pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_5551;
-		} else {
+		    current_pixel_format = GL_UNSIGNED_BYTE_3_3_2;
 		    convert_type = NO_CONVERSION;
-		}
-	    } else if ((src_pf->u2.dwRBitMask ==        0xF000) &&
-		       (src_pf->u3.dwGBitMask ==        0x0F00) &&
-		       (src_pf->u4.dwBBitMask ==        0x00F0) &&
-		       (src_pf->u5.dwRGBAlphaBitMask == 0x000F)) {
-		current_format = GL_RGBA;
-		internal_format = GL_RGBA;
-		current_pixel_format = GL_UNSIGNED_SHORT_4_4_4_4;
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_4444;
 		} else {
-		    convert_type = NO_CONVERSION;
+		    error = TRUE;
 		}
-	    } else if ((src_pf->u2.dwRBitMask ==        0x0F00) &&
-		       (src_pf->u3.dwGBitMask ==        0x00F0) &&
-		       (src_pf->u4.dwBBitMask ==        0x000F) &&
-		       (src_pf->u5.dwRGBAlphaBitMask == 0xF000)) {
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_4444_ARGB;
+	    }
+	} else if (src_pf->u1.dwRGBBitCount == 16) {
+	    if ((src_pf->dwFlags & DDPF_ALPHAPIXELS) &&
+		(src_pf->u5.dwRGBAlphaBitMask != 0x0000)) {
+		if ((src_pf->u2.dwRBitMask ==        0xF800) &&
+		    (src_pf->u3.dwGBitMask ==        0x07C0) &&
+		    (src_pf->u4.dwBBitMask ==        0x003E) &&
+		    (src_pf->u5.dwRGBAlphaBitMask == 0x0001)) {
+		    current_format = GL_RGBA;
+		    internal_format = GL_RGBA;
+		    current_pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_5551;
+		    } else {
+			convert_type = NO_CONVERSION;
+		    }
+		} else if ((src_pf->u2.dwRBitMask ==        0xF000) &&
+			   (src_pf->u3.dwGBitMask ==        0x0F00) &&
+			   (src_pf->u4.dwBBitMask ==        0x00F0) &&
+			   (src_pf->u5.dwRGBAlphaBitMask == 0x000F)) {
 		    current_format = GL_RGBA;
 		    internal_format = GL_RGBA;
 		    current_pixel_format = GL_UNSIGNED_SHORT_4_4_4_4;
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_4444;
+		    } else {
+			convert_type = NO_CONVERSION;
+		    }
+		} else if ((src_pf->u2.dwRBitMask ==        0x0F00) &&
+			   (src_pf->u3.dwGBitMask ==        0x00F0) &&
+			   (src_pf->u4.dwBBitMask ==        0x000F) &&
+			   (src_pf->u5.dwRGBAlphaBitMask == 0xF000)) {
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_4444_ARGB;
+			current_format = GL_RGBA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_SHORT_4_4_4_4;
+		    } else {
+			convert_type = NO_CONVERSION;
+			current_format = GL_BGRA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+		    }
+		} else if ((src_pf->u2.dwRBitMask ==        0x7C00) &&
+			   (src_pf->u3.dwGBitMask ==        0x03E0) &&
+			   (src_pf->u4.dwBBitMask ==        0x001F) &&
+			   (src_pf->u5.dwRGBAlphaBitMask == 0x8000)) {
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_1555;
+			current_format = GL_RGBA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
+		    } else {
+			convert_type = NO_CONVERSION;
+			current_format = GL_BGRA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+		    }
 		} else {
-		    convert_type = NO_CONVERSION;
-		    current_format = GL_BGRA;
-		    internal_format = GL_RGBA;
-		    current_pixel_format = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+		    error = TRUE;
 		}
-	    } else if ((src_pf->u2.dwRBitMask ==        0x7C00) &&
-		       (src_pf->u3.dwGBitMask ==        0x03E0) &&
-		       (src_pf->u4.dwBBitMask ==        0x001F) &&
-		       (src_pf->u5.dwRGBAlphaBitMask == 0x8000)) {
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_1555;
+	    } else {
+		if ((src_pf->u2.dwRBitMask == 0xF800) &&
+		    (src_pf->u3.dwGBitMask == 0x07E0) &&
+		    (src_pf->u4.dwBBitMask == 0x001F)) {
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_565;
+			current_format = GL_RGBA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
+		    } else {
+			convert_type = NO_CONVERSION;
+			current_format = GL_RGB;
+			internal_format = GL_RGB;
+			current_pixel_format = GL_UNSIGNED_SHORT_5_6_5;
+		    }
+		} else if ((src_pf->u2.dwRBitMask == 0x7C00) &&
+			   (src_pf->u3.dwGBitMask == 0x03E0) &&
+			   (src_pf->u4.dwBBitMask == 0x001F)) {
+		    convert_type = CONVERT_555;
 		    current_format = GL_RGBA;
 		    internal_format = GL_RGBA;
 		    current_pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
 		} else {
-		    convert_type = NO_CONVERSION;
-		    current_format = GL_BGRA;
-		    internal_format = GL_RGBA;
-		    current_pixel_format = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+		    error = TRUE;
 		}
-	    } else if ((src_pf->u2.dwRBitMask ==        0x7C00) &&
-		       (src_pf->u3.dwGBitMask ==        0x03E0) &&
-		       (src_pf->u4.dwBBitMask ==        0x001F) &&
-		       (src_pf->u5.dwRGBAlphaBitMask == 0x0000)) {
-		convert_type = CONVERT_555;
-		current_format = GL_RGBA;
-		internal_format = GL_RGBA;
-		current_pixel_format = GL_UNSIGNED_SHORT_5_5_5_1;
-	    } else {
-		error = TRUE;
 	    }
 	} else if (src_pf->u1.dwRGBBitCount == 24) {
-	    if ((src_pf->u2.dwRBitMask ==        0x00FF0000) &&
-		(src_pf->u3.dwGBitMask ==        0x0000FF00) &&
-		(src_pf->u4.dwBBitMask ==        0x000000FF) &&
-		(src_pf->u5.dwRGBAlphaBitMask == 0x00000000)) {
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_RGB24;
-		    current_format = GL_RGBA;
-		    internal_format = GL_RGBA;
-		    current_pixel_format = GL_UNSIGNED_INT_8_8_8_8;
+	    if ((src_pf->dwFlags & DDPF_ALPHAPIXELS) &&
+		(src_pf->u5.dwRGBAlphaBitMask != 0x000000)) {
+		error = TRUE;
+	    } else {
+		if ((src_pf->u2.dwRBitMask == 0xFF0000) &&
+		    (src_pf->u3.dwGBitMask == 0x00FF00) &&
+		    (src_pf->u4.dwBBitMask == 0x0000FF)) {
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_RGB24;
+			current_format = GL_RGBA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_INT_8_8_8_8;
+		    } else {
+			convert_type = NO_CONVERSION;
+			current_format = GL_BGR;
+			internal_format = GL_RGB;
+			current_pixel_format = GL_UNSIGNED_BYTE;
+		    }
 		} else {
-		    convert_type = NO_CONVERSION;
-		    current_format = GL_BGR;
-		    internal_format = GL_RGB;
-		    current_pixel_format = GL_UNSIGNED_BYTE;
+		    error = TRUE;
 		}
-	    } else {
-		error = TRUE;
 	    }
 	} else if (src_pf->u1.dwRGBBitCount == 32) {
-	    if ((src_pf->u2.dwRBitMask ==        0xFF000000) &&
-		(src_pf->u3.dwGBitMask ==        0x00FF0000) &&
-		(src_pf->u4.dwBBitMask ==        0x0000FF00) &&
-		(src_pf->u5.dwRGBAlphaBitMask == 0x000000FF)) {
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_8888;
-		} else {
-		    convert_type = NO_CONVERSION;
-		}
-		current_format = GL_RGBA;
-		internal_format = GL_RGBA;
-		current_pixel_format = GL_UNSIGNED_INT_8_8_8_8;
-	    } else if ((src_pf->u2.dwRBitMask ==        0x00FF0000) &&
-		       (src_pf->u3.dwGBitMask ==        0x0000FF00) &&
-		       (src_pf->u4.dwBBitMask ==        0x000000FF) &&
-		       (src_pf->u5.dwRGBAlphaBitMask == 0xFF000000)) {
-		if (colorkey_active) {
-		    convert_type = CONVERT_CK_8888_ARGB;
+	    if ((src_pf->dwFlags & DDPF_ALPHAPIXELS) &&
+		(src_pf->u5.dwRGBAlphaBitMask != 0x00000000)) {
+		if ((src_pf->u2.dwRBitMask ==        0xFF000000) &&
+		    (src_pf->u3.dwGBitMask ==        0x00FF0000) &&
+		    (src_pf->u4.dwBBitMask ==        0x0000FF00) &&
+		    (src_pf->u5.dwRGBAlphaBitMask == 0x000000FF)) {
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_8888;
+		    } else {
+			convert_type = NO_CONVERSION;
+		    }
 		    current_format = GL_RGBA;
 		    internal_format = GL_RGBA;
 		    current_pixel_format = GL_UNSIGNED_INT_8_8_8_8;
+		} else if ((src_pf->u2.dwRBitMask ==        0x00FF0000) &&
+			   (src_pf->u3.dwGBitMask ==        0x0000FF00) &&
+			   (src_pf->u4.dwBBitMask ==        0x000000FF) &&
+			   (src_pf->u5.dwRGBAlphaBitMask == 0xFF000000)) {
+		    if (colorkey_active) {
+			convert_type = CONVERT_CK_8888_ARGB;
+			current_format = GL_RGBA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_INT_8_8_8_8;
+		    } else {
+			convert_type = NO_CONVERSION;
+			current_format = GL_BGRA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_INT_8_8_8_8_REV;
+		    }
 		} else {
-		    convert_type = NO_CONVERSION;
-		    current_format = GL_BGRA;
-		    internal_format = GL_RGBA;
-		    current_pixel_format = GL_UNSIGNED_INT_8_8_8_8_REV;
+		    error = TRUE;
 		}
-	    } else if ((src_pf->u2.dwRBitMask ==        0x00FF0000) &&
-		       (src_pf->u3.dwGBitMask ==        0x0000FF00) &&
-		       (src_pf->u4.dwBBitMask ==        0x000000FF) &&
-		       (src_pf->u5.dwRGBAlphaBitMask == 0x00000000)) {
-		if (need_alpha_ck == TRUE) {
-		    convert_type = CONVERT_RGB32_888;
-		    current_format = GL_RGBA;
-		    internal_format = GL_RGBA;
-		    current_pixel_format = GL_UNSIGNED_INT_8_8_8_8;
+	    } else {
+		if ((src_pf->u2.dwRBitMask == 0x00FF0000) &&
+		    (src_pf->u3.dwGBitMask == 0x0000FF00) &&
+		    (src_pf->u4.dwBBitMask == 0x000000FF)) {
+		    if (need_alpha_ck == TRUE) {
+			convert_type = CONVERT_RGB32_888;
+			current_format = GL_RGBA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_INT_8_8_8_8;
+		    } else {
+			convert_type = NO_CONVERSION;
+			current_format = GL_BGRA;
+			internal_format = GL_RGBA;
+			current_pixel_format = GL_UNSIGNED_INT_8_8_8_8_REV;
+		    }
 		} else {
-		    convert_type = NO_CONVERSION;
-		    current_format = GL_BGRA;
-		    internal_format = GL_RGBA;
-		    current_pixel_format = GL_UNSIGNED_INT_8_8_8_8_REV;
+		    error = TRUE;
 		}
-	    } else {
-		error = TRUE;
 	    }
 	} else {
 	    error = TRUE;
@@ -807,8 +826,8 @@
     } 
 
     if (error == TRUE) {
+	ERR("Unsupported pixel format for textures : \n");
 	if (ERR_ON(ddraw)) {
-	    ERR("  unsupported pixel format for textures : \n");
 	    DDRAW_dump_pixelformat(src_pf);
 	}
 	return DDERR_INVALIDPIXELFORMAT;


More information about the wine-patches mailing list