[D3D] Various things...
Lionel Ulmer
lionel.ulmer at free.fr
Sat May 24 15:12:13 CDT 2003
Changelog:
- do not search for attached surfaces if the texture has not the
MIPMAP flag set
- add GL crit. section support for matrix setting
- support the various BLEND texture operations
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- dlls/ddraw_CVS/d3ddevice/mesa.c Sat May 24 01:37:13 2003
+++ dlls/ddraw/d3ddevice/mesa.c Sat May 24 22:03:05 2003
@@ -1783,6 +1783,27 @@
glTexEnvi(GL_TEXTURE_ENV, parm, GL_ADD_SIGNED_EXT);
break;
+ /* For the four blending modes, use the Arg2 parameter */
+ case D3DTOP_BLENDDIFFUSEALPHA:
+ case D3DTOP_BLENDTEXTUREALPHA:
+ case D3DTOP_BLENDFACTORALPHA:
+ case D3DTOP_BLENDCURRENTALPHA: {
+ GLenum src = GL_PRIMARY_COLOR_EXT; /* Just to prevent a compiler warning.. */
+
+ switch (dwState) {
+ case D3DTOP_BLENDDIFFUSEALPHA: src = GL_PRIMARY_COLOR_EXT;
+ case D3DTOP_BLENDTEXTUREALPHA: src = GL_TEXTURE;
+ case D3DTOP_BLENDFACTORALPHA: src = GL_CONSTANT_EXT;
+ case D3DTOP_BLENDCURRENTALPHA: src = GL_PREVIOUS_EXT;
+ }
+
+ glTexEnvi(GL_TEXTURE_ENV, parm, GL_INTERPOLATE_ARB);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_EXT, src);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_EXT, GL_SRC_ALPHA);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_ALPHA_EXT, src);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_ALPHA_EXT, GL_SRC_ALPHA);
+ } break;
+
default:
handled = FALSE;
break;
@@ -1942,7 +1963,9 @@
}
if ((dwState & 0xFF) != D3DTTFF_DISABLE) {
+ LEAVE_GL();
This->matrices_updated(This, TEXMAT0_CHANGED << dwStage);
+ ENTER_GL();
}
if (handled == TRUE) {
@@ -2722,19 +2745,25 @@
glThis->transform_state = GL_TRANSFORM_NONE;
}
}
- for (tex_mat = TEXMAT0_CHANGED, tex_stage = 0; tex_mat <= TEXMAT7_CHANGED; tex_mat <<= 1, tex_stage++) {
- if (matrices & tex_mat) {
- if (This->state_block.texture_stage_state[tex_stage][D3DTSS_TEXTURETRANSFORMFLAGS - 1] != D3DTTFF_DISABLE) {
- if (tex_stage == 0) {
- /* No multi-texturing support for now ... */
+ if (matrices & (TEXMAT0_CHANGED|TEXMAT1_CHANGED|TEXMAT2_CHANGED|TEXMAT3_CHANGED|
+ TEXMAT4_CHANGED|TEXMAT5_CHANGED|TEXMAT6_CHANGED|TEXMAT7_CHANGED))
+ {
+ ENTER_GL();
+ for (tex_mat = TEXMAT0_CHANGED, tex_stage = 0; tex_mat <= TEXMAT7_CHANGED; tex_mat <<= 1, tex_stage++) {
+ if (matrices & tex_mat) {
+ if (This->state_block.texture_stage_state[tex_stage][D3DTSS_TEXTURETRANSFORMFLAGS - 1] != D3DTTFF_DISABLE) {
+ if (tex_stage == 0) {
+ /* No multi-texturing support for now ... */
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf((float *) This->tex_mat[tex_stage]);
+ }
+ } else {
glMatrixMode(GL_TEXTURE);
- glLoadMatrixf((float *) This->tex_mat[tex_stage]);
+ glLoadIdentity();
}
- } else {
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
}
}
+ LEAVE_GL();
}
}
--- dlls/ddraw_CVS/d3dtexture.c Wed May 21 22:42:08 2003
+++ dlls/ddraw/d3dtexture.c Sat May 24 18:30:11 2003
@@ -585,7 +585,11 @@
}
}
- surf_ptr = get_sub_mimaplevel(surf_ptr);
+ if (surf_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) {
+ surf_ptr = get_sub_mimaplevel(surf_ptr);
+ } else {
+ surf_ptr = NULL;
+ }
}
return DD_OK;
@@ -817,8 +821,16 @@
}
}
- src_ptr = get_sub_mimaplevel(src_ptr);
- dst_ptr = get_sub_mimaplevel(dst_ptr);
+ if (src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) {
+ src_ptr = get_sub_mimaplevel(src_ptr);
+ } else {
+ src_ptr = NULL;
+ }
+ if (dst_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) {
+ dst_ptr = get_sub_mimaplevel(dst_ptr);
+ } else {
+ dst_ptr = NULL;
+ }
if ((src_ptr == NULL) || (dst_ptr == NULL)) {
if (src_ptr != dst_ptr) {
More information about the wine-patches
mailing list