Module: wine Branch: master Commit: 59ecdbd43e9a839979f54a7ac2db8a213362f048 URL: https://gitlab.winehq.org/wine/wine/-/commit/59ecdbd43e9a839979f54a7ac2db8a2...
Author: Zebediah Figura zfigura@codeweavers.com Date: Thu Jul 13 18:12:40 2023 -0500
opengl32: Correctly interpret glMapBuffer() access in wow64 mapping.
---
dlls/opengl32/unix_wgl.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index 92a77b78f18..a03f8337fbf 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -1857,6 +1857,19 @@ static NTSTATUS wow64_map_buffer( TEB *teb, GLint buffer, GLenum target, void *p return STATUS_INVALID_ADDRESS; }
+static GLbitfield map_range_flags_from_map_flags( GLenum flags ) +{ + switch (flags) + { + case GL_READ_ONLY: return GL_MAP_READ_BIT; + case GL_WRITE_ONLY: return GL_MAP_WRITE_BIT; + case GL_READ_WRITE: return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT; + default: + ERR( "invalid map flags %#x\n", flags ); + return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT; + } +} + static NTSTATUS wow64_unmap_buffer( void *ptr, SIZE_T size, GLbitfield access ) { void *wow_ptr; @@ -1968,7 +1981,8 @@ static NTSTATUS wow64_gl_map_buffer( void *args, NTSTATUS (*gl_map_buffer64)(voi if (params32->ret) params.ret = get_buffer_pointer( params.teb, params.target ); else if ((status = gl_map_buffer64( ¶ms ))) return status;
- status = wow64_map_buffer( params.teb, 0, params.target, params.ret, 0, params.access, ¶ms32->ret ); + status = wow64_map_buffer( params.teb, 0, params.target, params.ret, 0, + map_range_flags_from_map_flags( params.access ), ¶ms32->ret ); if (!status || status == STATUS_INVALID_ADDRESS) return status;
unmap_buffer( params.teb, params.target ); @@ -2038,7 +2052,8 @@ static NTSTATUS wow64_gl_map_named_buffer( void *args, NTSTATUS (*gl_map_named_b if (params32->ret) params.ret = get_named_buffer_pointer( params.teb, params.buffer ); else if ((status = gl_map_named_buffer64( ¶ms ))) return status;
- status = wow64_map_buffer( params.teb, params.buffer, 0, params.ret, 0, params.access, ¶ms32->ret ); + status = wow64_map_buffer( params.teb, params.buffer, 0, params.ret, 0, + map_range_flags_from_map_flags( params.access ), ¶ms32->ret ); if (!status || status == STATUS_INVALID_ADDRESS) return status;
unmap_named_buffer( params.teb, params.buffer );