[11/23] wined3d: Implement primitive restart index.

Andrew Wesie awesie at gmail.com
Sun Nov 13 12:35:11 CST 2016


Signed-off-by: Andrew Wesie <awesie at gmail.com>
---
 dlls/wined3d/directx.c     |  3 +++
 dlls/wined3d/glsl_shader.c | 14 ++++++++++++++
 dlls/wined3d/wined3d_gl.h  |  2 ++
 3 files changed, 19 insertions(+)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index a8c8c9f..c930cf6 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -121,6 +121,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
     {"GL_ARB_draw_elements_base_vertex",    ARB_DRAW_ELEMENTS_BASE_VERTEX },
     {"GL_ARB_draw_instanced",               ARB_DRAW_INSTANCED            },
     {"GL_ARB_ES2_compatibility",            ARB_ES2_COMPATIBILITY         },
+    {"GL_ARB_ES3_compatibility",            ARB_ES3_COMPATIBILITY         },
     {"GL_ARB_explicit_attrib_location",     ARB_EXPLICIT_ATTRIB_LOCATION  },
     {"GL_ARB_fragment_coord_conventions",   ARB_FRAGMENT_COORD_CONVENTIONS},
     {"GL_ARB_fragment_program",             ARB_FRAGMENT_PROGRAM          },
@@ -228,6 +229,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
     {"GL_NV_half_float",                    NV_HALF_FLOAT                 },
     {"GL_NV_light_max_exponent",            NV_LIGHT_MAX_EXPONENT         },
     {"GL_NV_point_sprite",                  NV_POINT_SPRITE               },
+    {"GL_NV_primitive_restart",             NV_PRIMITIVE_RESTART          },
     {"GL_NV_register_combiners",            NV_REGISTER_COMBINERS         },
     {"GL_NV_register_combiners2",           NV_REGISTER_COMBINERS2        },
     {"GL_NV_texgen_reflection",             NV_TEXGEN_REFLECTION          },
@@ -3125,6 +3127,7 @@ static void load_gl_funcs(struct wined3d_gl_info *gl_info)
     USE_GL_FUNC(glMapBuffer)                /* OpenGL 1.5 */
     USE_GL_FUNC(glPointParameteri)          /* OpenGL 1.4 */
     USE_GL_FUNC(glPointParameteriv)         /* OpenGL 1.4 */
+    USE_GL_FUNC(glPrimitiveRestartIndex)
     USE_GL_FUNC(glShaderSource)             /* OpenGL 2.0 */
     USE_GL_FUNC(glStencilFuncSeparate)      /* OpenGL 2.0 */
     USE_GL_FUNC(glStencilOpSeparate)        /* OpenGL 2.0 */
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index f136536..27a5533 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -8613,6 +8613,20 @@ static void shader_glsl_init_context_state(struct wined3d_context *context)
 
     gl_info->gl_ops.gl.p_glEnable(GL_PROGRAM_POINT_SIZE);
     checkGLcall("GL_PROGRAM_POINT_SIZE");
+    if (gl_info->supported[ARB_ES3_COMPATIBILITY])
+    {
+        /* We prefer this method because it correctly handles 16-bit and 32-bit indices. */
+        gl_info->gl_ops.gl.p_glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
+        checkGLcall("GL_PRIMITIVE_RESTART_FIXED_INDEX");
+    }
+    else if (gl_info->supported[NV_PRIMITIVE_RESTART] && GL_EXTCALL(glPrimitiveRestartIndex))
+    {
+        /* FIXME: Does this handle 16-bit indices correctly? */
+        GL_EXTCALL(glPrimitiveRestartIndex(0xFFFFFFFF));
+        checkGLcall("glPrimitiveRestartIndex");
+        gl_info->gl_ops.gl.p_glEnable(GL_PRIMITIVE_RESTART);
+        checkGLcall("GL_PRIMITIVE_RESTART");
+    }
 }
 
 static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps)
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index b71190d..038c781 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -55,6 +55,7 @@ enum wined3d_gl_extension
     ARB_DRAW_ELEMENTS_BASE_VERTEX,
     ARB_DRAW_INSTANCED,
     ARB_ES2_COMPATIBILITY,
+    ARB_ES3_COMPATIBILITY,
     ARB_EXPLICIT_ATTRIB_LOCATION,
     ARB_FRAGMENT_COORD_CONVENTIONS,
     ARB_FRAGMENT_PROGRAM,
@@ -159,6 +160,7 @@ enum wined3d_gl_extension
     NV_HALF_FLOAT,
     NV_LIGHT_MAX_EXPONENT,
     NV_POINT_SPRITE,
+    NV_PRIMITIVE_RESTART,
     NV_REGISTER_COMBINERS,
     NV_REGISTER_COMBINERS2,
     NV_TEXGEN_REFLECTION,
-- 
2.7.4




More information about the wine-patches mailing list