Don't want to see articles from a certain category? When logged in, go to your User Settings and adjust your feed in the Content Preferences section where you can block tags!
We do often include affiliate links to earn us some pennies. See more here.

The latest and greatest from the Wine development team is now available with Wine 2.21 which include support for Direct 3D indirect draws.

Here's their highlights:

  • Still more metafile support in GdiPlus.
  • Indirect draws support in Direct 3D.
  • Calling convention fixes on ARM.
  • Improved serial port detection on Linux.
  • Services fixes on WoW64.
  • Better DPI scaling in the Shell Explorer.
  • Various bug fixes.

They noted 16 specific bugs they've been able to close. From that list, they've corrected a bug in NieR:Automata where bullets were invisible. They also fixed The Witcher 3 freezing systems in some cases, fixed an issue with multiple games needing sample_c_lz for cube/array textures (Winexy, Witcher 3, Flame in the Flood) and more.

Article taken from GamingOnLinux.com.
Tags: Wine
7 Likes
About the author -
author picture
I am the owner of GamingOnLinux. After discovering Linux back in the days of Mandrake in 2003, I constantly came back to check on the progress of Linux until Ubuntu appeared on the scene and it helped me to really love it. You can reach me easily by emailing GamingOnLinux directly.
See more from me
The comments on this article are closed.
19 comments
Page: «2/2
  Go to:

wojtek88 Nov 12, 2017
Quoting: Sputnik_tr_02
Quoting: slaapliedjeWonder if it works with Diablo 3. So, my friend finally convinced me to play it.. and then it stopped working in Wine.

I suppose they broke it when they updated it to drop support for XP. Unfortunately it runs worse in Windows 10 than it did in Linux with Wine.
You can use PlayonLinux to choose which wine version you want to use with the game. That is handy when regressions like that happen.
As far as I know some time ago there was an issue with Diablo 3 because of Battle.NET changes, not because of Wine regression.

Anyway, it looks like Diablo 3 is gold in 2.19-staging, so it should work very nice.


Last edited by wojtek88 on 12 November 2017 at 8:46 am UTC
slaapliedje Nov 13, 2017
I tried 2.20 and 2.0.1 if I recall. It crashes as soon as you get to the login screen, and yes it is due to the update Blizzard released recently, not a Wine regression. You now have to run it with windows7 or later.
holzi Nov 13, 2017
Well I haven't tried Diablo 3 recently, but I played Starcraft 2 just fine yesterday with wine-staging 2.20 and had no problems with the Battle.net app
De1m0s Nov 13, 2017
There's not only light.
DarkSouls3 does not start anymore, with this version; so does Rise of the Tomb Raider. No way.
No difference with RE7 or WalkingDead3. Nothing happens here.

Do not missunderstand me; i'm happy with every new wine-version. Unfortunately, not everything goes better with higher versions.
mrdeathjr Nov 13, 2017
Quoting: De1m0sThere's not only light.
DarkSouls3 does not start anymore, with this version; so does Rise of the Tomb Raider. No way.
No difference with RE7 or WalkingDead3. Nothing happens here.

Do not missunderstand me; i'm happy with every new wine-version. Unfortunately, not everything goes better with higher versions.

Lastest titles case DX10/11 dont be tested in vanilla wine because lack of many staging patchs and this patchs allow run many games

Vanilla wine is usefull for older titles case DX9 and older games

Staging 2.21 will be appear is someplace of this week

^_^


Last edited by mrdeathjr on 13 November 2017 at 7:37 pm UTC
slaapliedje Nov 14, 2017
Tbe secret to Wine is to use something like PlayOnLinux. Then you can pin thw verio n of Wine per container.
Shmerl Nov 14, 2017
Quoting: slaapliedjeTbe secret to Wine is to use something like PlayOnLinux. Then you can pin thw verio n of Wine per container.

You can just use env variables for that and launcher scripts. But same thing really.
De1m0s Nov 14, 2017
Quoting: slaapliedjeTbe secret to Wine is to use something like PlayOnLinux. Then you can pin thw verio n of Wine per container.

I´m using PoL since i´m using wine.
It´s a very good tool, for handling wine-versions and installing components.
YoRHa-2B Nov 15, 2017
Quoting: wojtek88How does the NieR: Automata perform like? In Wine DB I can see it's silver. Does anyone managed to play the game?
The game has been working very well with wine-staging ever since the bug mentioned in the release notes was fixed.


This is on an old Phenom II X6 and an RX 480, mesa-git. 40+ FPS most of the time, only in some demanding areas it drops down into the 30s. My Xbox One pad also works fine when using dumbxinputemu (don't even try to play this with mouse+keyboard).

On Mesa, especially with LLVM 5.0 or later, you may need to create some shader overrides (see spoiler below) in order to work around some nasty LLVM/shader compiler issues. Otherwise, the game will probably look like this.

Spoiler, click me
Save these shader files to /some/directory, then launch the game (or steam) with MESA_SHADER_READ_PATH=/some/directory set.

FS_feba74122c9590d1522b92bbec52d662ecd99012.glsl
#version 440
#extension GL_ARB_gpu_shader5 : enable
#extension GL_ARB_shader_atomic_counters : enable
#extension GL_ARB_shader_bit_encoding : enable
#extension GL_ARB_shader_image_load_store : enable
#extension GL_ARB_shader_image_size : enable
#extension GL_ARB_shader_storage_buffer_object : enable
#extension GL_ARB_shading_language_420pack : enable
#extension GL_ARB_shading_language_packing : enable
#extension GL_ARB_texture_cube_map_array : enable
#extension GL_ARB_texture_gather : enable
#extension GL_ARB_texture_query_levels : enable
#extension GL_ARB_uniform_buffer_object : enable
#extension GL_EXT_texture_array : enable
#extension GL_ARB_conservative_depth : enable
#extension GL_ARB_derivative_control : enable
#extension GL_ARB_explicit_attrib_location : enable
#extension GL_ARB_fragment_coord_conventions : enable
#extension GL_ARB_fragment_layer_viewport : enable
#extension GL_ARB_shader_texture_lod : enable
uniform vec4 ps_icb[4];
layout(std140, binding = 0) uniform block_ps_cb0 { vec4 ps_cb0[15]; };
layout(std140, binding = 10) uniform block_ps_cb10 { vec4 ps_cb10[23]; };
layout(std140, binding = 13) uniform block_ps_cb13 { vec4 ps_cb13[1]; };
layout(binding = 0)
uniform sampler2D ps_sampler0;
layout(binding = 1)
uniform sampler2DShadow ps_sampler1;
vec4 R0;
vec4 R1;
vec4 R2;
vec4 R3;
vec4 R4;
vec4 R5;
vec4 R6;
vec4 R7;
vec4 R8;
vec4 X0[4];
vec4 tmp0;
vec4 tmp1;
in shader_in_out {
 vec4 reg0;
 vec4 reg1;
 vec4 reg2;
 vec4 reg3;
 vec4 reg4;
 vec4 reg5;
 vec4 reg6;
 vec4 reg7;
 vec4 reg8;
 vec4 reg9;
 vec4 reg10;
 vec4 reg11;
 vec4 reg12;
 vec4 reg13;
 vec4 reg14;
 vec4 reg15;
 vec4 reg16;
 vec4 reg17;
 vec4 reg18;
 vec4 reg19;
 vec4 reg20;
 vec4 reg21;
 vec4 reg22;
 vec4 reg23;
 vec4 reg24;
 vec4 reg25;
 vec4 reg26;
 vec4 reg27;
 vec4 reg28;
 vec4 reg29;
 vec4 reg30;
 vec4 reg31;
} shader_in;
vec4 ps_in[32];
vec4 vpos;
layout(location = 0) out vec4 ps_out0;
layout(location = 1) out vec4 ps_out1;
layout(location = 2) out vec4 ps_out2;
layout(location = 3) out vec4 ps_out3;
layout(location = 4) out vec4 ps_out4;
layout(location = 5) out vec4 ps_out5;
layout(location = 6) out vec4 ps_out6;
layout(location = 7) out vec4 ps_out7;
void main() {
  vpos = gl_FragCoord;
  ps_in[0].xyzw = vpos.xyzw;
  ps_in[1].xy = shader_in.reg1.xy;
  ps_in[2].xyzw = shader_in.reg2.xyzw;
  R0.x = (texture(ps_sampler0, ps_in[1].xy).x);
  R0.x = ((R0.x * ps_cb13[0].y) + ps_cb13[0].x);
  R0.yz = (R0.xx * ps_in[2].xy);
  R1.xy = (R0.yz * ps_in[2].zw);
  R1.z = (-R0.x);
  R1.w = (uintBitsToFloat(0x3f800000u));
  R0.x = (dot(R1.xyzw, ps_cb0[12].xyzw));
  R0.y = (dot(R1.xyzw, ps_cb0[13].xyzw));
  R0.z = (dot(R1.xyzw, ps_cb0[14].xyzw));
  R0.w = (uintBitsToFloat(0x3f800000u));
  R1.x = (dot(R0.xyzw, ps_cb10[7].xyzw));
  R1.y = (dot(R0.xyzw, ps_cb10[8].xyzw));
  R1.w = (dot(R0.xyzw, ps_cb10[9].xyzw));
  R1.z = (dot(R0.xyzw, ps_cb10[10].xyzw));
  X0[0].xyw = (R1.xyz);
  R1.x = (R1.w / R1.z);
  R2.xyzw = (ps_cb10[0].xyzw * ps_cb10[1].xyzw);
  R1.x = ((-R2.x * uintBitsToFloat(0x3dcccccdu)) + R1.x);
  X0[0].z = (R1.x);
  R1.x = (dot(R0.xyzw, ps_cb10[11].xyzw));
  R1.y = (dot(R0.xyzw, ps_cb10[12].xyzw));
  R1.w = (dot(R0.xyzw, ps_cb10[13].xyzw));
  R1.z = (dot(R0.xyzw, ps_cb10[14].xyzw));
  X0[1].xyw = (R1.xyz);
  R1.x = (R1.w / R1.z);
  R1.x = ((-R2.y * uintBitsToFloat(0x3dcccccdu)) + R1.x);
  X0[1].z = (R1.x);
  R1.x = (dot(R0.xyzw, ps_cb10[15].xyzw));
  R1.y = (dot(R0.xyzw, ps_cb10[16].xyzw));
  R1.w = (dot(R0.xyzw, ps_cb10[17].xyzw));
  R1.z = (dot(R0.xyzw, ps_cb10[18].xyzw));
  X0[2].xyw = (R1.xyz);
  R1.x = (R1.w / R1.z);
  R1.x = ((-R2.z * uintBitsToFloat(0x3dcccccdu)) + R1.x);
  X0[2].z = (R1.x);
  R1.x = (dot(R0.xyzw, ps_cb10[19].xyzw));
  R1.y = (dot(R0.xyzw, ps_cb10[20].xyzw));
  R1.w = (dot(R0.xyzw, ps_cb10[21].xyzw));
  R1.z = (dot(R0.xyzw, ps_cb10[22].xyzw));
  X0[3].xyw = (R1.xyz);
  R0.x = (R1.w / R1.z);
  R0.x = ((-R2.w * uintBitsToFloat(0x3dcccccdu)) + R0.x);
  X0[3].z = (R0.x);
  R0.xyzw = (uintBitsToFloat(uvec4(0u, 0u, 0u, 0u)).xyzw);
  for (;;) {
    R1.x = uintBitsToFloat(floatBitsToUint(R0).y >= 0x4u ? 0xffffffffu : 0u);
//     if (bool(floatBitsToUint(R1).x))  // Original code generated by wine, shows artifacts
    if (floatBitsToUint(R0).y >= 0x4u)  // Technically the same condition as above, works properly
      break;
    R1.xyzw = (X0[floatBitsToInt(R0).y + 0].xyzw);
    R1.xy = (R1.xy / R1.ww);
    R1.z = (max(abs(R1.z), abs(R1.y)));
    R1.z = (max(R1.z, abs(R1.x)));
    R1.z = uintBitsToFloat(uintBitsToFloat(0x3f7d70a4u) >= R1.z ? 0xffffffffu : 0u);
    if (bool(floatBitsToUint(R1).z)) {
      R0.zw = (R1.xy);
      break;
    }
    R0.xy = intBitsToFloat(floatBitsToInt(R0).xy + ivec4(0x1, 0x1, 0, 0).xy);
    R0.zw = (R1.xy);
  }
  R0.y = uintBitsToFloat(floatBitsToUint(R0).x < 0x4u ? 0xffffffffu : 0u);
  if (bool(floatBitsToUint(R0).y)) {
    R0.y = (R0.z + uintBitsToFloat(0x3f800000u));
    R0.z = uintBitsToFloat(floatBitsToUint(R0).x & 0x1u);
    R0.z = (float(floatBitsToUint(R0).z));
    R0.z = (R0.z * uintBitsToFloat(0x3f000000u));
    R1.x = ((R0.y * uintBitsToFloat(0x3e800000u)) + R0.z);
    R0.y = (-R0.w + uintBitsToFloat(0x3f800000u));
    R0.z = uintBitsToFloat(floatBitsToUint(R0).x >> 0x1u);
    R0.z = (float(floatBitsToUint(R0).z));
    R0.z = (R0.z * uintBitsToFloat(0x3f000000u));
    R1.y = ((R0.y * uintBitsToFloat(0x3e800000u)) + R0.z);
    R1.z = (X0[floatBitsToInt(R0).x + 0].z);
    R0.x = (dot(ps_cb10[2].xyzw, ps_icb[floatBitsToInt(R0).x + 0].xyzw));
    R0.yzw = ((R0.xxx * uintBitsToFloat(uvec4(0u, 0x3f000000u, 0x3f000000u, 0u)).yzw) + R1.xyz);
    R2.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0xbf000000u, 0xbf000000u, 0u, 0u)).xyz) + R1.xyz);
    R3.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0xbf000000u, 0x3f000000u, 0u, 0u)).xyz) + R1.xyz);
    R4.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0x3f000000u, 0xbf000000u, 0u, 0u)).xyz) + R1.xyz);
    R5.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0xbfc00000u, 0x3f000000u, 0u, 0u)).xyz) + R1.xyz);
    R6.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0x3fc00000u, 0xbf000000u, 0u, 0u)).xyz) + R1.xyz);
    R7.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0xbf000000u, 0x3fc00000u, 0u, 0u)).xyz) + R1.xyz);
    R8.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0x3f000000u, 0xbfc00000u, 0u, 0u)).xyz) + R1.xyz);
    R1.w = (vec4(textureLod(ps_sampler1, vec3(R1.xy, R1.z), 0)).w);
    R0.y = (vec4(textureLod(ps_sampler1, vec3(R0.yz, R0.w), 0)).y);
    R0.y = ((R0.y * uintBitsToFloat(0x3f4ccccdu)) + R1.w);
    R0.z = (vec4(textureLod(ps_sampler1, vec3(R2.xy, R2.z), 0)).z);
    R0.y = ((R0.z * uintBitsToFloat(0x3f4ccccdu)) + R0.y);
    R0.z = (vec4(textureLod(ps_sampler1, vec3(R3.xy, R3.z), 0)).z);
    R0.y = ((R0.z * uintBitsToFloat(0x3f4ccccdu)) + R0.y);
    R0.z = (vec4(textureLod(ps_sampler1, vec3(R4.xy, R4.z), 0)).z);
    R0.y = ((R0.z * uintBitsToFloat(0x3f4ccccdu)) + R0.y);
    R0.z = (vec4(textureLod(ps_sampler1, vec3(R5.xy, R5.z), 0)).z);
    R0.y = ((R0.z * uintBitsToFloat(0x3ee66666u)) + R0.y);
    R0.z = (vec4(textureLod(ps_sampler1, vec3(R6.xy, R6.z), 0)).z);
    R0.y = ((R0.z * uintBitsToFloat(0x3ee66666u)) + R0.y);
    R0.z = (vec4(textureLod(ps_sampler1, vec3(R7.xy, R7.z), 0)).z);
    R0.y = ((R0.z * uintBitsToFloat(0x3ee66666u)) + R0.y);
    R0.z = (vec4(textureLod(ps_sampler1, vec3(R8.xy, R8.z), 0)).z);
    R0.y = ((R0.z * uintBitsToFloat(0x3ee66666u)) + R0.y);
    R0.z = uintBitsToFloat(R0.y != uintBitsToFloat(0u) ? 0xffffffffu : 0u);
    if (bool(floatBitsToUint(R0).z)) {
      R2.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0x3fc00000u, 0x3fc00000u, 0u, 0u)).xyz) + R1.xyz);
      R3.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0xbfc00000u, 0xbfc00000u, 0u, 0u)).xyz) + R1.xyz);
      R4.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0xbfc00000u, 0x3fc00000u, 0u, 0u)).xyz) + R1.xyz);
      R5.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0x3fc00000u, 0xbfc00000u, 0u, 0u)).xyz) + R1.xyz);
      R6.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0x3fc00000u, 0x3f000000u, 0u, 0u)).xyz) + R1.xyz);
      R7.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0xbfc00000u, 0xbf000000u, 0u, 0u)).xyz) + R1.xyz);
      R8.xyz = ((R0.xxx * uintBitsToFloat(uvec4(0x3f000000u, 0x3fc00000u, 0u, 0u)).xyz) + R1.xyz);
      R0.xzw = ((R0.xxx * uintBitsToFloat(uvec4(0xbf000000u, 0u, 0xbfc00000u, 0u)).xzw) + R1.xyz);
      R1.x = (vec4(textureLod(ps_sampler1, vec3(R2.xy, R2.z), 0)).x);
      R1.x = ((R1.x * uintBitsToFloat(0x3e19999au)) + R0.y);
      R1.y = (vec4(textureLod(ps_sampler1, vec3(R3.xy, R3.z), 0)).y);
      R1.x = ((R1.y * uintBitsToFloat(0x3e19999au)) + R1.x);
      R1.y = (vec4(textureLod(ps_sampler1, vec3(R4.xy, R4.z), 0)).y);
      R1.x = ((R1.y * uintBitsToFloat(0x3e19999au)) + R1.x);
      R1.y = (vec4(textureLod(ps_sampler1, vec3(R5.xy, R5.z), 0)).y);
      R1.x = ((R1.y * uintBitsToFloat(0x3e19999au)) + R1.x);
      R1.y = (vec4(textureLod(ps_sampler1, vec3(R6.xy, R6.z), 0)).y);
      R1.x = ((R1.y * uintBitsToFloat(0x3ee66666u)) + R1.x);
      R1.y = (vec4(textureLod(ps_sampler1, vec3(R7.xy, R7.z), 0)).y);
      R1.x = ((R1.y * uintBitsToFloat(0x3ee66666u)) + R1.x);
      R1.y = (vec4(textureLod(ps_sampler1, vec3(R8.xy, R8.z), 0)).y);
      R1.x = ((R1.y * uintBitsToFloat(0x3ee66666u)) + R1.x);
      R0.x = (vec4(textureLod(ps_sampler1, vec3(R0.xz, R0.w), 0)).x);
      R0.x = ((R0.x * uintBitsToFloat(0x3ee66666u)) + R1.x);
      R0.x = (R0.x * uintBitsToFloat(0x3df3cf3du));
    } else {
    R0.x = (R0.y * uintBitsToFloat(0x3e2aaaabu));
    }
    R0.x = (-R0.x + uintBitsToFloat(0x3f800000u));
  } else {
    R0.x = (uintBitsToFloat(0x3f800000u));
  }
  ps_out0.xyzw = (R0.xxxx);
  return;
}


CS_2a215c714114a24e60cf40a87f5226cfa26a5df5.glsl
#version 430

layout(std140, binding = 76)
uniform block_cs_cb1 {
  vec4 unused;          
  vec2 img_size;        // Image size, in pixels
  vec2 num_workgroups;  // Number of CS workgroups (we use gl_NumWorkGroups instead)
};

layout(binding = 160)
uniform sampler2D cs_sampler0;  // Scaled scene image

layout(binding = 0)
writeonly uniform uimageBuffer cs_image0;  // Output buffer

shared float cs_g0[64];

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;

void main() {
  float sum = 0.0f;
  
  for (int y = 0; y < 8; y++) {
    for (int x = 0; x < 8; x++) {
      ivec2 coord = 8 * ivec2(gl_WorkGroupID.xy) + ivec2(x, y);
      if ((coord.x < img_size.x) && (coord.y < img_size.y)) {
        vec3 color = texelFetch(cs_sampler0, 8 * ivec2(gl_WorkGroupID.xy) + ivec2(x, y), 0).xyz;
        sum += dot(color, vec3(0.298912f, 0.586611f, 0.114478f));
      } else {
        sum += 1.0f;
      }
    }
  }

  imageStore(cs_image0,
    int(gl_WorkGroupID.y * gl_NumWorkGroups.x + gl_WorkGroupID.x),
    uvec4(floatBitsToUint(sum), 0, 0, 0));
}
While you're here, please consider supporting GamingOnLinux on:

Reward Tiers: Patreon. Plain Donations: PayPal.

This ensures all of our main content remains totally free for everyone! Patreon supporters can also remove all adverts and sponsors! Supporting us helps bring good, fresh content. Without your continued support, we simply could not continue!

You can find even more ways to support us on this dedicated page any time. If you already are, thank you!
The comments on this article are closed.