LINUX.ORG.RU

Divinity Original Sin Enhanced Edition @ Mesa r600g

 ,


20

4

Я таки заставил эту игру работать 😊

В процессе была куча сегфолтов и адовые артефакты.

По сути проблемы всего три (конкретно для r600g, в целом для месы – 2):

  1. Контекст OpenGL 4.2. Драйвер r600g рапортует версию 3.3, а движок игры, в свою очередь, работает по принципу segfault driven error handling. Решается просто:
    MESA_GL_VERSION_OVERRIDE=4.2 
    MESA_GLSL_VERSION_OVERRIDE=420
  2. Невалидные шейдеры. Тут сразу:
    • Во-первых, разрабы используют расширение ARB_shading_language_include, которое не поддерживается ничем кроме невидиевской проприетарщины. Но во имя амдшной проприетарщины они запилили в движок fallback режим, в котором это расширение реализуется прямо в движке на коленке, однако включается этот fallback режим (немного) через жопу – они (только) проверяют возвращаемое значение функции glXGetProcAddressARB на nullptr. А glXGetProcAddressARB не обязан возвращать nullptr, кроме адреса надо смотреть еще в список расширений, чего они не делают, а месовская реализация никогда не возвращает nullptr -> segfault driven error handling. Чинится этот баг подстановкой костыля в LD_PRELOAD.
    • Во-вторых, в шейдерах постобработки SMAA/FXAA у них где-то в дебрях кода обложенное ifdef'ами лежит включение очередного расширения, что, блджад, не правильно. После обнаружения этой фигни месовский GLSL компилятор совершенно справедливо прерывает компиляцию, а так как ребята не умеют в обработку ошибок — см. выше. Этот баг обходится с помощью месовского механизма подмены шейдеров в рантайме и костыля-решейпера их кода шейдеров. файла drirc, в который нужно добавить
      <application name='Divinity Original Sin Enhanced Edition' executable='EoCApp'>
          <option name='allow_glsl_extension_directive_midshader' value='true' />
      </application>
  3. Графические артефакты. У них в движке (насколько я понял) есть две принципиально разные ветки кода/рендеринга, которые разделяются по (внимание!) строке в GL_VENDOR: если в этой строке что угодно кроме "ATI Technologies Inc.", то активируется невидиевская ветвь, что на месе приводит к аду, если же доставить в LD_PRELOAD еще один костыль с этой строкой, то рендеринг становится мягким и шелковистым.

TL;DR: Gentoo, дефолтные кеды, ШГ, панелька с автоскрытием.

>>> Просмотр (1600x900, 1682 Kb)

★★★★★

Проверено: JB ()
Последнее исправление: DeadEye (всего исправлений: 6)

Помницца, на YCombinator проскакивали откровения какого-то драйверописателя, вроде нвидии.

Всё как ты описываешь: зачастую в драйвера вставляют неиллюзорные костыли для исправления косяков разработчиков игр. Именно из-за этого, к сожалению, игры ААА класса никогда не будут полноценно работать на открытых драйверах.

Ну может быть влукан ситуацию малость поправит, но навряд ли.

Macil ★★★★★
()
Ответ на: комментарий от Stil

file work.so work.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

file /usr/bin/wine /usr/bin/wine: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.0, BuildID[sha1]=14bdf3028e765eca1a6452664962f09593eba4e4, stripped

file /usr/bin/ls /usr/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.0, BuildID[sha1]=ac974b79d4341914b9cc84d301fa95b551cf3eae, stripped

Novell-ch ★★★★★
()
Ответ на: комментарий от Novell-ch

Но оно должно работать...

Ок, просто для уверености — команды были такие:

gcc -m32 -Wall -fPIC -DPIC -c mesa_ovverride_vnd_rndr.c 
ld -melf_i386 -shared -o ./mesa_ovverride_vnd_rndr.so ./mesa_ovverride_vnd_rndr.o -ldl -lGL

?

И ещё — покажи

printenv LD_PRELOAD

Stil ★★★★★
() автор топика
Ответ на: комментарий от Novell-ch

хотя по трейсу

trace:wgl:X11DRV_WineGL_InitOpenglInfo GL version             : 4.3.
trace:wgl:X11DRV_WineGL_InitOpenglInfo GL renderer            : AMD Radeon R9 200 Series.
trace:wgl:X11DRV_WineGL_InitOpenglInfo GLX version            : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Server GLX version     : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Server GLX vendor:     : SGI.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Client GLX version     : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Client GLX vendor:     : Mesa Project and SGI.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Direct rendering enabled: True
Novell-ch ★★★★★
()
Последнее исправление: Novell-ch (всего исправлений: 1)
Ответ на: комментарий от Novell-ch

проверил на стиме, работает, а в вайне не хочет

Значит вайновское шаманство с dll-loader'ом сильнее шаманства с LD_PRELOAD. Это плохо.

Можно накатить на месу такой патч %)

diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c
index 6e90511..ed851f4 100644
--- a/src/mesa/main/getstring.c
+++ b/src/mesa/main/getstring.c
@@ -118,6 +118,13 @@ _mesa_GetString( GLenum name )
    if (!ctx)
       return NULL;
 
+   const char *env_vendor = getenv("HMESA_VENDOR_OVERRIDE");
+   if ((name == GL_VENDOR) && env_vendor)
+      return (const GLubyte*) env_vendor;
+   const char *env_renderer = getenv("HMESA_RENDERER_OVERRIDE");
+   if ((name == GL_RENDERER) && env_renderer)
+      return (const GLubyte*) env_renderer;
+
    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
 
    /* this is a required driver function */

Но это уже настолько адовые костыли, что я даже не знаю...

Stil ★★★★★
() автор топика
Ответ на: комментарий от Novell-ch

походу надо делать обертку для запросов wgl renreder и прочих

Не, вендор/рендерер это уровень дров, а не обвязки над оконной системой, это вотчина месы...

Stil ★★★★★
() автор топика
Последнее исправление: Stil (всего исправлений: 1)
Ответ на: комментарий от Novell-ch

ругается на
GL_EXT_direct_state_access

Херня какая-то:

 [ ~ ] $ glxinfo -s | grep EXT_direct_state_access
 [ ~ ] $ glxinfo -s | grep ARB_direct_state_access
    GL_ARB_direct_state_access
 [ ~ ] $ 

https://www.opengl.org/registry/specs/ARB/direct_state_access.txt

This extension derives from the GL_EXT_direct_state_access extension

Но в твоём логе нет ни того, ни другого...

А ещё меня смущает отсутствие GL_ARB_tessellation_shader в твоём логе, оно ведь у тебя есть?

glxinfo -s | grep GL_ARB_tessellation_shader

Может profile_mask надо не удалять, а выставлять в FC...

Stil ★★★★★
() автор топика
Ответ на: комментарий от Stil

то я баловался с 3.2COMPAT и потому тесселяция недоступна, с FC или вообще без оверайда оно сегфолтится, так что только компат и да ARB_direct_state_access есть, а EXT_direct_state_access нету

Novell-ch ★★★★★
()
Ответ на: комментарий от Novell-ch

то я баловался с 3.2COMPAT и потому тесселяция недоступна, с FC или вообще без оверайда оно сегфолтится, так что только компат и да ARB_direct_state_access есть, а EXT_direct_state_access нету

Не, я не о том. В оверрайде месовской версии пиши 4.3COMPAT (или, что там у тебя нативное). Игра сама создаст нужный контекст.

Скажи ты таки победил LD_PRELOAD? Это важно, потому что ошибки с glTexMultiSubImage2DAMD, glCompressedTexMultiSubImage2DAMD и glGetMultiQueryObjectuivAMD легко поюедить через LD_PRELOAD и нифига не легко через месу.

Stil ★★★★★
() автор топика
Ответ на: комментарий от Stil

с патчем на месу меняется только вендор HMESA_VENDOR_OVERRIDE=«AMD » HMESA_RENDERER_OVERRIDE=«AMD Radeon HD 7970» LD_PRELOAD=/home/pont/bin/work.so GALLIUM_HUD=.dfps MESA_SHADER_READ_PATH=/docker/tmp/read/read/ MESA_GL_VERSION_OVERRIDE=4.3COMPAT wine ./Rage.exe 1>/tmp/1 2>&1

trace:wgl:X11DRV_WineGL_InitOpenglInfo GL version             : 4.3 Mesa 12.1.0-devel (git-3a2e67b pontostroy:X11).
trace:wgl:X11DRV_WineGL_InitOpenglInfo GL renderer            : AMD Radeon HD 7970.
trace:wgl:X11DRV_WineGL_InitOpenglInfo GLX version            : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Server GLX version     : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Server GLX vendor:     : SGI.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Client GLX version     : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Client GLX vendor:     : Mesa Project and SGI.

c ld ничего не меняется WINEDEBUG=+wgl HMESA_GL_VENDOR_OVERRIDE=«AMD » HMESA_GL_RENDERER_OVERRIDE=«AMD Radeon HD 7970» LD_PRELOAD=/home/pont/bin/work.so GALLIUM_HUD=.dfps MESA_SHADER_READ_PATH=/docker/tmp/read/read/ MESA_GL_VERSION_OVERRIDE=4.3COMPAT wine ./Rage.exe 1>/tmp/1 2>&1

trace:wgl:X11DRV_WineGL_InitOpenglInfo GL version             : 4.3 Mesa 12.1.0-devel (git-3a2e67b pontostroy:X11).
trace:wgl:X11DRV_WineGL_InitOpenglInfo GL renderer            : Gallium 0.4 on AMD TAHITI (DRM 2.45.0 / 4.7.0-rc7-3-default, LLVM 4.0.0).
trace:wgl:X11DRV_WineGL_InitOpenglInfo GLX version            : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Server GLX version     : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Server GLX vendor:     : SGI.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Client GLX version     : 1.4.
trace:wgl:X11DRV_WineGL_InitOpenglInfo Client GLX vendor:     : Mesa Project and SGI.
Novell-ch ★★★★★
()
Ответ на: комментарий от Novell-ch

Круто, какие хаки использовались? Все? Патч на вайн для profile_mask, патч на месу для вендор/рендерер оверрайд, и ручной патчинг шейдеров?

Stil ★★★★★
() автор топика
Ответ на: комментарий от Novell-ch

Прочитай этот тред, и, в особенности, это сообщение. И проверь свой work.so, если взлетит, то можно будет обойтись и без патча на вайн.

Stil ★★★★★
() автор топика
Последнее исправление: Stil (всего исправлений: 1)
Ответ на: комментарий от Stil

неа, не хочет, может играет роль как вайн скомпилен, уже и 32 и 64 битнык версии подставлял, берет из месы рендер, с глхинфо работает норм.

Novell-ch ★★★★★
()

расширение ARB_shading_language_include

Только сейчас заметил что данная инструкция находится в разделе «The following extensions are not part of any OpenGL or OpenGL ES version, and we DO NOT WANT implementations of these extensions for Mesa.» с пометкой «Not interesting». Кому интересно в самом низу документа.

https://cgit.freedesktop.org/mesa/mesa/tree/docs/GL3.txt

Behem0th ★★★★★
()
Ответ на: комментарий от Behem0th

Пойду расскажу ему про _init() :)

Stil ★★★★★
() автор топика

а с новым вульфом не прокатило, все запускается, только вайн нужно пропатчить, но вместо текстур зеленое нечно, и руганина на компрпессию текстур,

Mesa: 6 similar GL_INVALID_OPERATION errors
Mesa: User error: GL_INVALID_VALUE in glCompressedTexSubImage2D(xoffset+width)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_VALUE in glCompressedTexSubImage2D(xoffset+width)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_VALUE in glCompressedTexSubImage2D(xoffset+width)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: 5 similar GL_INVALID_OPERATION errors
Mesa: User error: GL_INVALID_OPERATION in glCompressedTexSubImage2D(format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: 1 similar GL_INVALID_OPERATION errors
Mesa: User error: GL_INVALID_OPERATION in glCompressedTexSubImage2D(format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in glCompressedTexSubImage2D(format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in glCompressedTexSubImage2D(format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: 5 similar GL_INVALID_OPERATION errors
Mesa: User error: GL_INVALID_OPERATION in glCompressedTexSubImage2D(format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in glCompressedTexSubImage2D(format=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)
Mesa: User error: GL_INVALID_OPERATION in unsupported function called (unsupported extension or deprecated function?)

хотя это все вроде в месе есть уже сто лет

glxinfo |grep s3tc
ATTENTION: default value of option allow_glsl_extension_directive_midshader overridden by environment.                                                                                                            
ATTENTION: default value of option glsl_zero_init overridden by environment.                                                                                                                                      
ATTENTION: option value of option allow_glsl_extension_directive_midshader ignored.                                                                                                                               
ATTENTION: default value of option vblank_mode overridden by environment.                                                                                                                                         
    GL_EXT_texture_compression_s3tc, GL_EXT_texture_filter_anisotropic, 
    GL_OES_EGL_image, GL_OES_read_format, GL_S3_s3tc
    GL_EXT_texture_compression_s3tc, GL_EXT_texture_cube_map, 
    GL_OES_EGL_image, GL_OES_read_format, GL_S3_s3tc, 

Novell-ch ★★★★★
()
Ответ на: комментарий от Novell-ch

В любой непонятной ситуации – подменяй вендор/рендерер.

Stil ★★★★★
() автор топика
Ответ на: комментарий от Novell-ch

Mesa: User error: GL_INVALID_VALUE in glCompressedTexSubImage2D(xoffset+width)

Ctrl-F

static GLboolean
error_check_subtexture_dimensions(struct gl_context *ctx, GLuint dims,
   ...
   if (xoffset + subWidth > (GLint) destImage->Width) {
      _mesa_error(ctx, GL_INVALID_VALUE, "%s(xoffset+width)", func);
      return GL_TRUE;
   }

Как видишь, ошибка возникает, когда игра пытается записать за границы текстуры.

trycatch ★★★
()

Вот что написано в стандарте:

GL_INVALID_VALUE is generated if xoffset<−b, (xoffset+width)>(w−b), yoffset<−b, or (yoffset+height)>(h−b), where w is the GL_TEXTURE_WIDTH, h is the GL_TEXTURE_HEIGHT, and b is the border width of the texture image being modified. Note that w and h include twice the border width.

trycatch ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.