From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/opengl32/make_opengl | 4 ++++ dlls/opengl32/private.h | 1 + dlls/opengl32/thunks.c | 8 ++++++-- dlls/opengl32/wgl.c | 5 +++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index c5e72099d70..f7de9179b20 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -692,6 +692,8 @@ sub get_object_type($$$$) $class = "program" if $class eq "program/shader" and has_extension( $func, "GL_NV_vertex_program" ); $class = "program" if $class eq "program/shader" and has_extension( $func, "GL_EXT_direct_state_access" ); + $class = "shader_ext" if has_extension( $func, "GL_EXT_vertex_shader" ); + return "srcTarget == GL_RENDERBUFFER ? OBJ_TYPE_RENDERBUFFER : OBJ_TYPE_TEXTURE" if $pname eq "srcName"; return "dstTarget == GL_RENDERBUFFER ? OBJ_TYPE_RENDERBUFFER : OBJ_TYPE_TEXTURE" if $pname eq "dstName"; @@ -704,6 +706,7 @@ sub get_object_type($$$$) return "OBJ_TYPE_PROGRAM" if $class eq "program"; return "OBJ_TYPE_RENDERBUFFER" if $class eq "renderbuffer"; return "OBJ_TYPE_SAMPLER" if $class eq "sampler"; + return "OBJ_TYPE_SHADER_EXT" if $class eq "shader_ext" and $func =~ /^gl(Bind|GenVertex|Delete)/ and $pname =~ /^(id|ret)$/; return "OBJ_TYPE_TEXTURE" if $class eq "texture"; return "OBJ_TYPE_TEXTURE" if $func =~ /^glVDPAURegister/ and $pname eq "textureNames"; return "OBJ_TYPE_TEXTURE" if $func =~ /^gl(LGPU|Multicast|Async|)CopyImageSubData/ and $pname =~ /^(src|dst)Name$/; @@ -764,6 +767,7 @@ sub allocate_object_names($) return $ret if $name =~ /^glBindRenderbuffer/; return $ret if $name =~ /^glBindSampler/; return $ret if $name =~ /^glBindTexture/; + return $ret if $name =~ /^glBindVertexShader/; return $ret if $name =~ /^glNewList/; return 0; diff --git a/dlls/opengl32/private.h b/dlls/opengl32/private.h index 2a1de0a04ae..bb71b68f6b1 100644 --- a/dlls/opengl32/private.h +++ b/dlls/opengl32/private.h @@ -54,6 +54,7 @@ enum object_type OBJ_TYPE_PROGRAM, OBJ_TYPE_RENDERBUFFER, OBJ_TYPE_SAMPLER, + OBJ_TYPE_SHADER_EXT, OBJ_TYPE_TEXTURE, OBJ_TYPE_COUNT, }; diff --git a/dlls/opengl32/thunks.c b/dlls/opengl32/thunks.c index 331e49c924d..9e2808f6d71 100644 --- a/dlls/opengl32/thunks.c +++ b/dlls/opengl32/thunks.c @@ -3545,9 +3545,11 @@ static void WINAPI glBindVertexBuffers( GLuint first, GLsizei count, const GLuin static void WINAPI glBindVertexShaderEXT( GLuint id ) { - struct glBindVertexShaderEXT_params args = { .teb = NtCurrentTeb(), .id = id }; + struct glBindVertexShaderEXT_params args = { .teb = NtCurrentTeb() }; NTSTATUS status; TRACE( "id %d\n", id ); + if (!alloc_context_objects( OBJ_TYPE_SHADER_EXT, 1, &id, TRUE )) return; + args.id = *map_context_objects( OBJ_TYPE_SHADER_EXT, 1, &id ); if ((status = UNIX_CALL( glBindVertexShaderEXT, &args ))) WARN( "glBindVertexShaderEXT returned %#lx\n", status ); } @@ -6121,9 +6123,10 @@ static void WINAPI glDeleteVertexArraysAPPLE( GLsizei n, const GLuint *arrays ) static void WINAPI glDeleteVertexShaderEXT( GLuint id ) { - struct glDeleteVertexShaderEXT_params args = { .teb = NtCurrentTeb(), .id = id }; + struct glDeleteVertexShaderEXT_params args = { .teb = NtCurrentTeb() }; NTSTATUS status; TRACE( "id %d\n", id ); + args.id = *del_context_objects( OBJ_TYPE_SHADER_EXT, 1, &id ); if ((status = UNIX_CALL( glDeleteVertexShaderEXT, &args ))) WARN( "glDeleteVertexShaderEXT returned %#lx\n", status ); } @@ -7958,6 +7961,7 @@ static GLuint WINAPI glGenVertexShadersEXT( GLuint range ) NTSTATUS status; TRACE( "range %d\n", range ); if ((status = UNIX_CALL( glGenVertexShadersEXT, &args ))) WARN( "glGenVertexShadersEXT returned %#lx\n", status ); + args.ret = put_context_object_range( OBJ_TYPE_SHADER_EXT, range, args.ret ); return args.ret; } diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index ef926e0cbac..21bd2c6593a 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -111,6 +111,7 @@ static const char *debugstr_object_type( enum object_type type ) case OBJ_TYPE_PROGRAM: return "program"; case OBJ_TYPE_RENDERBUFFER: return "renderbuffer"; case OBJ_TYPE_SAMPLER: return "sampler"; + case OBJ_TYPE_SHADER_EXT: return "vertex shader"; case OBJ_TYPE_TEXTURE: return "texture"; case OBJ_TYPE_COUNT: break; } @@ -397,6 +398,7 @@ static GLuint create_object( enum object_type type ) case OBJ_TYPE_PROGRAM: { MAKE_OBJECT_CALL( glGenProgramsARB, .n = 1, .programs = &object ); return object; } case OBJ_TYPE_RENDERBUFFER: { MAKE_OBJECT_CALL( glGenRenderbuffers, .n = 1, .renderbuffers = &object ); return object; } case OBJ_TYPE_SAMPLER: { MAKE_OBJECT_CALL( glGenSamplers, .count = 1, .samplers = &object ); return object; } + case OBJ_TYPE_SHADER_EXT: { MAKE_OBJECT_CALL( glGenVertexShadersEXT, .range = 1 ); return args.ret; } case OBJ_TYPE_TEXTURE: { MAKE_OBJECT_CALL( glGenTextures, .n = 1, .textures = &object ); return object; } case OBJ_TYPE_COUNT: break; } @@ -607,6 +609,7 @@ BOOL alloc_context_objects( enum object_type type, UINT n, const GLuint *handles case OBJ_TYPE_FRAMEBUFFER: case OBJ_TYPE_RENDERBUFFER: case OBJ_TYPE_PROGRAM: + case OBJ_TYPE_SHADER_EXT: alloc_client = extension; break; case OBJ_TYPE_SAMPLER: @@ -730,6 +733,8 @@ static GLuint get_pname_object_type( GLenum pname ) case GL_VERTEX_PROGRAM_BINDING_NV: case GL_FRAGMENT_PROGRAM_BINDING_NV: return OBJ_TYPE_PROGRAM; + case GL_VERTEX_SHADER_BINDING_EXT: + return OBJ_TYPE_SHADER_EXT; } return OBJ_TYPE_COUNT; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11134