Commit cf365fe5 authored by Vitaly Lipatov's avatar Vitaly Lipatov

commit 14.1.3 upon wine-1.7.25

parent 67d5f87b
......@@ -480,6 +480,7 @@ BOOL schan_imp_init(void)
if (1) { /* CROSSOVER HACK - bug 10151 */
const char *libgnutls_name_candidates[] = {SONAME_LIBGNUTLS,
"libgnutls.so.28",
"libgnutls-deb0.so.28",
"libgnutls.so.26",
NULL};
int i;
......
......@@ -872,6 +872,101 @@ static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_re
return gl_vendor == GL_VENDOR_FGLRX;
}
static BOOL match_broken_round(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
const char *shader =
"#version 120\n"
"#extension GL_EXT_gpu_shader4 : enable\n"
"void main()\n"
"{\n"
" vec4 color;\n"
" vec4 rounded = round(gl_MultiTexCoord0.yxzw);\n"
" /* all(rounded == gl_MultiTexCoord1) fails for some reason */\n"
" if (all(equal(rounded, gl_MultiTexCoord1)))\n"
" {\n"
" color = vec4(0.0, 1.0, 0.0, 0.0);\n"
" }\n"
" else\n"
" {\n"
" color = vec4(1.0, 0.0, 0.0, 0.0);\n"
" }\n"
" gl_FrontColor = color;\n"
" gl_Position = gl_Vertex;\n"
"}\n";
GLuint tex, fbo;
GLuint prog, vs;
GLenum status;
DWORD check;
unsigned char red, green, blue;
if (!gl_info->supported[EXT_GPU_SHADER4]) return FALSE;
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
{
WARN("FBOs not available, guessing broken glsl round from driver info\n");
return gl_vendor == GL_VENDOR_APPLE && card_vendor == HW_VENDOR_AMD;
}
gl_info->gl_ops.gl.p_glGenTextures(1, &tex);
gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
checkGLcall("glTexImage2D");
gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
checkGLcall("glFramebufferTexture2D");
status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
checkGLcall("glCheckFramebufferStatus");
vs = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER));
GL_EXTCALL(glShaderSourceARB(vs, 1, &shader, 0));
GL_EXTCALL(glCompileShaderARB(vs));
prog = GL_EXTCALL(glCreateProgramObjectARB());
GL_EXTCALL(glAttachObjectARB(prog, vs));
GL_EXTCALL(glLinkProgramARB(prog));
GL_EXTCALL(glDeleteObjectARB(vs));
GL_EXTCALL(glUseProgramObjectARB(prog));
checkGLcall("round test shader setup");
gl_info->gl_ops.gl.p_glBegin(GL_QUADS);
GL_EXTCALL(glMultiTexCoord4fARB(0, 1.0, 2.0, 3.0, 4.0));
/* Note that the result is swizzled */
GL_EXTCALL(glMultiTexCoord4fARB(1, 2.0, 1.0, 3.0, 4.0));
gl_info->gl_ops.gl.p_glVertex3f(-1.0, -1.0, -0.5);
gl_info->gl_ops.gl.p_glVertex3f(-1.0, 1.0, -0.5);
gl_info->gl_ops.gl.p_glVertex3f( 1.0, 1.0, -0.5);
gl_info->gl_ops.gl.p_glVertex3f( 1.0, -1.0, -0.5);
gl_info->gl_ops.gl.p_glEnd();
checkGLcall("round test draw");
gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, tex);
gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, &check);
GL_EXTCALL(glUseProgramObjectARB(0));
GL_EXTCALL(glDeleteObjectARB(prog));
gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, 0);
gl_info->gl_ops.gl.p_glDeleteTextures(1, &tex);
checkGLcall("round test teardown");
TRACE("GLSL round test color: %08x\n", check);
red = (check & 0x00ff0000) >> 16;
green = (check & 0x0000ff00) >> 8;
blue = (check & 0x000000ff);
/* If round behaves correctly green is returned. Return FALSE in this
* case(don't enable quirk). For any other color return TRUE */
return (red > 0x10) || (green < 0xf0) || (blue > 0x10);
}
static void quirk_arb_constants(struct wined3d_gl_info *gl_info)
{
TRACE("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->limits.arb_vs_native_constants);
......@@ -1157,6 +1252,11 @@ static void quirk_limited_tex_filtering(struct wined3d_gl_info *gl_info)
gl_info->quirks |= WINED3D_QUIRK_LIMITED_TEX_FILTERING;
}
static void broken_round_quirk(struct wined3d_gl_info *gl_info)
{
gl_info->quirks |= WINED3D_CX_QUIRK_BROKEN_ROUND;
}
static void quirk_apple_double_buffer(struct wined3d_gl_info *gl_info)
{
gl_info->quirks |= WINED3D_CX_QUIRK_APPLE_DOUBLE_BUFFER;
......@@ -1310,6 +1410,11 @@ static const struct driver_quirk quirk_table[] =
"Render to FBO quirk"
},
{
match_broken_round,
broken_round_quirk,
"Broken GLSL round"
},
{
match_apple,
quirk_apple_double_buffer,
"Apple double buffered context bug (9330)"
......
......@@ -2508,7 +2508,7 @@ static void shader_glsl_mov(const struct wined3d_shader_instruction *ins)
/* We need to *round* to the nearest int here. */
unsigned int mask_size = shader_glsl_get_write_mask_size(write_mask);
if (gl_info->supported[EXT_GPU_SHADER4])
if (gl_info->supported[EXT_GPU_SHADER4] && !(gl_info->quirks & WINED3D_CX_QUIRK_BROKEN_ROUND))
{
if (mask_size > 1)
shader_addline(buffer, "ivec%d(round(%s)));\n", mask_size, src0_param.param_str);
......
......@@ -72,6 +72,7 @@
#define WINED3D_CX_QUIRK_BROKEN_ARA 0x00100000
#define WINED3D_CX_QUIRK_BLIT 0x00200000
#define WINED3D_CX_QUIRK_RENDER_TO_FBO 0x00800000
#define WINED3D_CX_QUIRK_BROKEN_ROUND 0x01000000
/* Texture format fixups */
......
......@@ -131,6 +131,7 @@ static Cursor create_cursor( HANDLE handle );
#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
static BOOL xinput2_available;
static BOOL broken_rawevents;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f
MAKE_FUNCPTR(XIFreeDeviceInfo);
MAKE_FUNCPTR(XIQueryDevice);
......@@ -1579,7 +1580,15 @@ void X11DRV_MotionNotify( HWND hwnd, XEvent *xev )
if (!hwnd)
{
struct x11drv_thread_data *thread_data = x11drv_thread_data();
if (thread_data->warp_serial && (long)(event->serial - thread_data->warp_serial) < 0) return;
if (thread_data->warp_serial)
{
if ((long)(event->serial - thread_data->warp_serial) < 0)
{
TRACE( "pos %d,%d old serial %lu, ignoring\n", input.u.mi.dx, input.u.mi.dy, event->serial );
return;
}
thread_data->warp_serial = 0; /* we caught up now */
}
}
send_mouse_input( hwnd, event->window, event->state, &input );
......@@ -1669,7 +1678,7 @@ static void X11DRV_RawMotion( XGenericEventCookie *xev )
break;
}
if (thread_data->warp_serial)
if (broken_rawevents && thread_data->warp_serial)
{
if ((long)(xev->serial - thread_data->warp_serial) < 0)
{
......@@ -1716,6 +1725,12 @@ void X11DRV_XInput2_Init(void)
#undef LOAD_FUNCPTR
xinput2_available = XQueryExtension( gdi_display, "XInputExtension", &xinput2_opcode, &event, &error );
/* Until version 1.10.4 rawinput was broken in XOrg, see
* https://bugs.freedesktop.org/show_bug.cgi?id=30068 */
broken_rawevents = strstr(XServerVendor( gdi_display ), "X.Org") &&
XVendorRelease( gdi_display ) < 11004000;
#else
TRACE( "X Input 2 support not compiled in.\n" );
#endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment