[D3D] Clean-ups and refactoring

Lionel Ulmer lionel.ulmer at free.fr
Fri May 30 08:54:54 CDT 2003


Changelog:
 - some clean-ups (extension code to be added soon)
 - some interface changes for future reuse for Blt / Lock code
 - fixed some Pitch problems in texture uploads (mostly for
   'small' mip-mapping levels)

-- 
		 Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c	2003-05-26 16:05:55.000000000 +0200
+++ dlls/ddraw/d3ddevice/mesa.c	2003-05-29 21:41:46.000000000 +0200
@@ -263,31 +263,6 @@
     d->dwReserved4 = 0;
 }
 
-#if 0 /* TODO : fix this and add multitexturing and other needed stuff */
-static void fill_device_capabilities(IDirectDrawImpl* ddraw)
-{
-    x11_dd_private *private = (x11_dd_private *) ddraw->d->private;
-    const char *ext_string;
-    Mesa_DeviceCapabilities *devcap;
-
-    private->device_capabilities = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(Mesa_DeviceCapabilities));
-    devcap = (Mesa_DeviceCapabilities *) private->device_capabilities;
-
-    ENTER_GL();
-    ext_string = glGetString(GL_EXTENSIONS);
-    /* Query for the ColorTable Extension */
-    if (strstr(ext_string, "GL_EXT_paletted_texture")) {
-        devcap->ptr_ColorTableEXT = (PFNGLCOLORTABLEEXTPROC) glXGetProcAddressARB("glColorTableEXT");
-	TRACE("Color table extension supported (function at %p)\n", devcap->ptr_ColorTableEXT);
-    } else {
-        TRACE("Color table extension not found.\n");
-    }
-    LEAVE_GL();
-}
-#endif
-
-
-
 HRESULT d3ddevice_enumerate(LPD3DENUMDEVICESCALLBACK cb, LPVOID context, DWORD version)
 {
     D3DDEVICEDESC dref, d1, d2;
--- dlls/ddraw_CVS/d3dtexture.c	2003-05-29 21:39:53.000000000 +0200
+++ dlls/ddraw/d3dtexture.c	2003-05-30 11:30:03.000000000 +0200
@@ -120,7 +120,7 @@
 	    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) == D3D_OK) {
+						  gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) == D3D_OK) {
 	        upload_surface_to_tex_memory(NULL, &(gl_surf_ptr->surface_ptr));
 		upload_surface_to_tex_memory_release();
 		gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
@@ -231,7 +231,7 @@
 		  (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) != D3D_OK) {
+						      gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) != D3D_OK) {
 		    upload_surface_to_tex_memory(NULL, &(gl_surf_ptr->surface_ptr));
 		    upload_surface_to_tex_memory_release();
 		    gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
@@ -244,7 +244,7 @@
 	    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) != D3D_OK) {
+						       gl_surf_ptr->initial_upload_done == FALSE, TRUE, 0, 0) != D3D_OK) {
 		    upload_surface_to_tex_memory(NULL, &(gl_surf_ptr->surface_ptr));
 		    upload_surface_to_tex_memory_release();
 		    gl_surf_ptr->dirty_flag = SURFACE_MEMORY;
--- dlls/ddraw_CVS/mesa.c	2003-05-29 21:39:53.000000000 +0200
+++ dlls/ddraw/mesa.c	2003-05-30 11:45:14.000000000 +0200
@@ -588,16 +588,35 @@
 static GLuint current_level;
 
 HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLuint level, GLenum *current_internal_format,
-					  BOOLEAN need_to_alloc, BOOLEAN need_alpha_ck)
+					  BOOLEAN need_to_alloc, BOOLEAN need_alpha_ck, DWORD tex_width, DWORD tex_height)
 {
     const DDPIXELFORMAT * const src_pf = &(surf_ptr->surface_desc.u4.ddpfPixelFormat);
     BOOL error = FALSE;
     BOOL colorkey_active = need_alpha_ck && (surf_ptr->surface_desc.dwFlags & DDSD_CKSRCBLT);
     GLenum internal_format = GL_LUMINANCE; /* A bogus value to be sure to have a nice Mesa warning :-) */
+    BYTE bpp = GET_BPP(surf_ptr->surface_desc);
 
     current_surface = surf_ptr;
     current_level = level;
 
+    /* First, do some sanity checks ... */
+    if ((surf_ptr->surface_desc.u1.lPitch % bpp) != 0) {
+	FIXME("Warning : pitch is not a multiple of BPP - not supported yet !\n");
+    }
+
+    /* Note: we only check width here as you cannot have width non-zero while height is set to zero */
+    if (tex_width != 0) {
+	glPixelStorei(GL_UNPACK_ROW_LENGTH, surf_ptr->surface_desc.u1.lPitch / bpp);
+    } else {
+	if (surf_ptr->surface_desc.u1.lPitch == (surf_ptr->surface_desc.dwWidth * bpp)) {
+	    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+	} else {
+	    glPixelStorei(GL_UNPACK_ROW_LENGTH, surf_ptr->surface_desc.u1.lPitch / bpp);
+	}
+	tex_width = surf_ptr->surface_desc.dwWidth;
+	tex_height = surf_ptr->surface_desc.dwHeight;
+    }
+
     if (src_pf->dwFlags & DDPF_PALETTEINDEXED8) {
 	/* ****************
 	   Paletted Texture
@@ -792,7 +811,7 @@
 	if ((need_to_alloc) ||
 	    (internal_format != *current_internal_format)) {
 	    glTexImage2D(GL_TEXTURE_2D, level, internal_format,
-			 surf_ptr->surface_desc.dwWidth, surf_ptr->surface_desc.dwHeight, 0,
+			 tex_width, tex_height, 0,
 			 current_format, current_pixel_format, NULL);
 	    *current_internal_format = internal_format;
 	}
@@ -805,7 +824,7 @@
 {
     const DDSURFACEDESC * const src_d = (DDSURFACEDESC *)&(current_surface->surface_desc);
     void *surf_buffer = NULL;
-    
+
     switch (convert_type) {
         case CONVERT_PALETTED: {
 	    IDirectDrawPaletteImpl* pal = current_surface->palette;
--- dlls/ddraw_CVS/mesa_private.h	2003-05-29 21:39:53.000000000 +0200
+++ dlls/ddraw/mesa_private.h	2003-05-30 11:27:02.000000000 +0200
@@ -148,17 +148,10 @@
 
 /* Memory to texture conversion code. Split in three functions to do some optimizations. */
 extern HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surface, GLuint level, GLenum *prev_internal_format,
-						 BOOLEAN need_to_alloc, BOOLEAN need_alpha_ck);
+						 BOOLEAN need_to_alloc, BOOLEAN need_alpha_ck, DWORD tex_width, DWORD tex_height);
 extern HRESULT upload_surface_to_tex_memory(RECT *rect, void **temp_buffer);
 extern HRESULT upload_surface_to_tex_memory_release(void);
 
-/* This structure contains all the function pointers to OpenGL extensions
-   that are used by Wine */
-typedef struct {
-    void (*ptr_ColorTableEXT) (GLenum target, GLenum internalformat,
-			       GLsizei width, GLenum format, GLenum type, const GLvoid *table);
-} Mesa_DeviceCapabilities;
-
 #endif /* HAVE_OPENGL */
 
 #endif /* __GRAPHICS_WINE_MESA_PRIVATE_H */


More information about the wine-patches mailing list