Commit ed883048 authored by Lionel Ulmer's avatar Lionel Ulmer Committed by Alexandre Julliard

- 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
parent fc58c2a9
......@@ -126,8 +126,8 @@ static void set_context(IDirect3DDeviceImpl* This)
{
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);
......@@ -1093,6 +1093,11 @@ static void draw_primitive_strided(IDirect3DDeviceImpl *This,
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));
......@@ -1104,10 +1109,6 @@ static void draw_primitive_strided(IDirect3DDeviceImpl *This,
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;
......@@ -1925,6 +1926,7 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This)
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);
}
}
......@@ -1933,6 +1935,13 @@ draw_primitive_handle_textures(IDirect3DDeviceImpl *This)
}
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 */
......@@ -2501,6 +2510,8 @@ d3ddevice_set_ortho(IDirect3DDeviceImpl *This)
GLfloat height, width;
GLfloat trans_mat[16];
TRACE("(%p)\n", This);
width = This->surface->surface_desc.dwWidth;
height = This->surface->surface_desc.dwHeight;
......@@ -2534,6 +2545,8 @@ void
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);
......@@ -2645,7 +2658,10 @@ d3ddevice_matrices_updated(IDirect3DDeviceImpl *This, DWORD matrices)
{
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;
......@@ -2723,25 +2739,35 @@ static void d3ddevice_lock_update(IDirectDrawSurfaceImpl* This, LPCRECT pRect, D
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.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) &&
(This->surface_desc.u4.ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x0000)) {
(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) &&
(This->surface_desc.u4.ddpfPixelFormat.u5.dwRGBAlphaBitMask == 0x00000000)) {
buffer_type = GL_UNSIGNED_BYTE;
(This->surface_desc.u4.ddpfPixelFormat.u4.dwBBitMask == 0x000000FF)) {
buffer_type = GL_UNSIGNED_INT_8_8_8_8_REV;
buffer_color = GL_BGRA;
glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
} else {
ERR(" unsupported pixel format at device locking.\n");
return;
}
} else {
ERR(" unsupported pixel format at device locking - alpha on frame buffer.\n");
return;
}
ENTER_GL();
......@@ -2774,8 +2800,6 @@ static void d3ddevice_lock_update(IDirectDrawSurfaceImpl* This, LPCRECT pRect, D
dst += This->surface_desc.u1.lPitch;
}
glPixelStorei(GL_PACK_SWAP_BYTES, FALSE);
if (is_front)
gl_d3d_dev->front_state = SURFACE_MEMORY;
else
......@@ -2834,7 +2858,7 @@ static void d3ddevice_flush_to_frame_buffer(IDirect3DDeviceImpl *d3d_dev, LPCREC
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;
}
......@@ -2948,6 +2972,9 @@ static void d3ddevice_unlock_update(IDirectDrawSurfaceImpl* This, LPCRECT pRect)
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);
......@@ -3008,9 +3035,11 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirectDrawImpl *d3d, IDirectDrawSur
object->matrices_updated = d3ddevice_matrices_updated;
object->flush_to_framebuffer = d3ddevice_flush_to_frame_buffer;
TRACE(" creating OpenGL device for surface = %p, d3d = %p\n", surface, d3d);
InitializeCriticalSection(&(object->crit));
TRACE(" creating OpenGL device for surface = %p, d3d = %p\n", surface, d3d);
TRACE(" device critical section : %p\n", &(object->crit));
device_context = GetDC(surface->ddraw_owner->window);
gl_object->display = get_display(device_context);
......
......@@ -154,6 +154,9 @@ static void update(IDirect3DLightImpl* This) {
static void activate(IDirect3DLightImpl* This) {
IDirect3DLightGLImpl *glThis = (IDirect3DLightGLImpl *) This;
TRACE("(%p)\n", This);
ENTER_GL();
update(This);
/* If was not active, activate it */
......@@ -166,6 +169,9 @@ static void activate(IDirect3DLightImpl* This) {
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) {
......
......@@ -266,10 +266,13 @@ gltex_upload_texture(IDirectDrawSurfaceImpl *surf_ptr, IDirect3DDeviceImpl *d3dd
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);
}
}
......@@ -303,6 +306,8 @@ gltex_setcolorkey_cb(IDirectDrawSurfaceImpl *This, DWORD dwFlags, LPDDCOLORKEY c
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);
......@@ -368,6 +373,10 @@ gltex_bltfast(IDirectDrawSurfaceImpl *surf_ptr, DWORD dstx,
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 @@ gltex_bltfast(IDirectDrawSurfaceImpl *surf_ptr, DWORD dstx,
(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 @@ static void gltex_set_palette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteIm
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);
......@@ -837,17 +853,18 @@ HRESULT d3dtexture_create(IDirectDrawImpl *d3d, IDirectDrawSurfaceImpl *surf, BO
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();
......
......@@ -88,7 +88,6 @@ void set_render_state(IDirect3DDeviceImpl* This,
DWORD dwRenderState = lpStateBlock->render_state[dwRenderStateType - 1];
IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
if (TRACE_ON(ddraw))
TRACE("%s = %08lx\n", _get_renderstate(dwRenderStateType), dwRenderState);
/* First, all the stipple patterns */
......@@ -623,6 +622,10 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
RGB Textures
************ */
if (src_pf->u1.dwRGBBitCount == 8) {
if ((src_pf->dwFlags & DDPF_ALPHAPIXELS) &&
(src_pf->u5.dwRGBAlphaBitMask != 0x00)) {
error = TRUE;
} else {
if ((src_pf->u2.dwRBitMask == 0xE0) &&
(src_pf->u3.dwGBitMask == 0x1C) &&
(src_pf->u4.dwBBitMask == 0x03)) {
......@@ -641,23 +644,11 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
} else {
error = TRUE;
}
}
} 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 == 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;
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)) {
......@@ -711,10 +702,27 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
internal_format = GL_RGBA;
current_pixel_format = GL_UNSIGNED_SHORT_1_5_5_5_REV;
}
} else {
error = TRUE;
}
} 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) &&
(src_pf->u5.dwRGBAlphaBitMask == 0x0000)) {
(src_pf->u4.dwBBitMask == 0x001F)) {
convert_type = CONVERT_555;
current_format = GL_RGBA;
internal_format = GL_RGBA;
......@@ -722,11 +730,15 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
} 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 ((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;
......@@ -741,7 +753,10 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
} else {
error = TRUE;
}
}
} else if (src_pf->u1.dwRGBBitCount == 32) {
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) &&
......@@ -769,10 +784,13 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
internal_format = GL_RGBA;
current_pixel_format = GL_UNSIGNED_INT_8_8_8_8_REV;
}
} else if ((src_pf->u2.dwRBitMask == 0x00FF0000) &&
} else {
error = TRUE;
}
} else {
if ((src_pf->u2.dwRBitMask == 0x00FF0000) &&
(src_pf->u3.dwGBitMask == 0x0000FF00) &&
(src_pf->u4.dwBBitMask == 0x000000FF) &&
(src_pf->u5.dwRGBAlphaBitMask == 0x00000000)) {
(src_pf->u4.dwBBitMask == 0x000000FF)) {
if (need_alpha_ck == TRUE) {
convert_type = CONVERT_RGB32_888;
current_format = GL_RGBA;
......@@ -787,6 +805,7 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
} else {
error = TRUE;
}
}
} else {
error = TRUE;
}
......@@ -795,8 +814,8 @@ HRESULT upload_surface_to_tex_memory_init(IDirectDrawSurfaceImpl *surf_ptr, GLui
}
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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment