From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/opengl32/make_opengl | 3 +++ dlls/opengl32/private.h | 1 + dlls/opengl32/tests/opengl.c | 5 ++--- dlls/opengl32/thunks.c | 8 ++++++-- dlls/opengl32/wgl.c | 3 +++ 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index f7de9179b20..539d86cffe0 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -692,6 +692,7 @@ 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_ati" if has_extension( $func, "GL_ATI_fragment_shader" ); $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"; @@ -706,6 +707,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_ATI" if $class eq "shader_ati" and $func =~ /^gl(Bind|GenFragment|Delete)/ and $pname =~ /^(id|ret)$/; 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"; @@ -767,6 +769,7 @@ sub allocate_object_names($) return $ret if $name =~ /^glBindRenderbuffer/; return $ret if $name =~ /^glBindSampler/; return $ret if $name =~ /^glBindTexture/; + return $ret if $name =~ /^glBindFragmentShader/; return $ret if $name =~ /^glBindVertexShader/; return $ret if $name =~ /^glNewList/; diff --git a/dlls/opengl32/private.h b/dlls/opengl32/private.h index bb71b68f6b1..6ca327db512 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_ATI, OBJ_TYPE_SHADER_EXT, OBJ_TYPE_TEXTURE, OBJ_TYPE_COUNT, diff --git a/dlls/opengl32/tests/opengl.c b/dlls/opengl32/tests/opengl.c index 9bc73bf008e..db5d81fe6d8 100644 --- a/dlls/opengl32/tests/opengl.c +++ b/dlls/opengl32/tests/opengl.c @@ -1511,11 +1511,10 @@ static void test_object_creation( HDC winhdc ) if (i == OBJ_DISPLAY_LIST) ok_ret( GL_INVALID_OPERATION, glGetError() ); else { - /* host often doesn't support GL_ARB_vertex_program / GL_NV_shader_program in core contexts */ - todo_wine_if( i == OBJ_PROGRAM_ARB || i == OBJ_PROGRAM_NV ) + /* host often doesn't support legacy program / shaders in core contexts */ + todo_wine_if( i == OBJ_PROGRAM_ARB || i == OBJ_PROGRAM_NV || i == OBJ_SHADER_EXT || i == OBJ_SHADER_ATI ) /* Wine never allows implicit allocation in core contexts */ todo_wine_if( i == OBJ_FENCE_APPLE || i == OBJ_FENCE_NV || i == OBJ_PATH_NV || - i == OBJ_SHADER_EXT || i == OBJ_SHADER_ATI || i == OBJ_SEMAPHORE_EXT || i == OBJ_TRANSFORM_FEEDBACK_NV || i == OBJ_VERTEX_ARRAY_APPLE ) ok_ret( GL_NO_ERROR, glGetError() ); diff --git a/dlls/opengl32/thunks.c b/dlls/opengl32/thunks.c index 9e2808f6d71..5c5a8587bab 100644 --- a/dlls/opengl32/thunks.c +++ b/dlls/opengl32/thunks.c @@ -3266,9 +3266,11 @@ static void WINAPI glBindFragDataLocationIndexed( GLuint program, GLuint colorNu static void WINAPI glBindFragmentShaderATI( GLuint id ) { - struct glBindFragmentShaderATI_params args = { .teb = NtCurrentTeb(), .id = id }; + struct glBindFragmentShaderATI_params args = { .teb = NtCurrentTeb() }; NTSTATUS status; TRACE( "id %d\n", id ); + if (!alloc_context_objects( OBJ_TYPE_SHADER_ATI, 1, &id, TRUE )) return; + args.id = *map_context_objects( OBJ_TYPE_SHADER_ATI, 1, &id ); if ((status = UNIX_CALL( glBindFragmentShaderATI, &args ))) WARN( "glBindFragmentShaderATI returned %#lx\n", status ); } @@ -5850,9 +5852,10 @@ static void WINAPI glDeleteFencesNV( GLsizei n, const GLuint *fences ) static void WINAPI glDeleteFragmentShaderATI( GLuint id ) { - struct glDeleteFragmentShaderATI_params args = { .teb = NtCurrentTeb(), .id = id }; + struct glDeleteFragmentShaderATI_params args = { .teb = NtCurrentTeb() }; NTSTATUS status; TRACE( "id %d\n", id ); + args.id = *del_context_objects( OBJ_TYPE_SHADER_ATI, 1, &id ); if ((status = UNIX_CALL( glDeleteFragmentShaderATI, &args ))) WARN( "glDeleteFragmentShaderATI returned %#lx\n", status ); } @@ -7766,6 +7769,7 @@ static GLuint WINAPI glGenFragmentShadersATI( GLuint range ) NTSTATUS status; TRACE( "range %d\n", range ); if ((status = UNIX_CALL( glGenFragmentShadersATI, &args ))) WARN( "glGenFragmentShadersATI returned %#lx\n", status ); + args.ret = put_context_object_range( OBJ_TYPE_SHADER_ATI, range, args.ret ); return args.ret; } diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index 21bd2c6593a..2712296477a 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_ATI: return "fragment shader"; case OBJ_TYPE_SHADER_EXT: return "vertex shader"; case OBJ_TYPE_TEXTURE: return "texture"; case OBJ_TYPE_COUNT: break; @@ -398,6 +399,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_ATI: { MAKE_OBJECT_CALL( glGenFragmentShadersATI, .range = 1 ); return args.ret; } 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; @@ -610,6 +612,7 @@ BOOL alloc_context_objects( enum object_type type, UINT n, const GLuint *handles case OBJ_TYPE_RENDERBUFFER: case OBJ_TYPE_PROGRAM: case OBJ_TYPE_SHADER_EXT: + case OBJ_TYPE_SHADER_ATI: alloc_client = extension; break; case OBJ_TYPE_SAMPLER: -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11134