Rico Schüller : wined3d: Add GL_NV_point_sprite extension.
Alexandre Julliard
julliard at winehq.org
Mon Jul 19 11:05:40 CDT 2010
Module: wine
Branch: master
Commit: 894a150f69ffbd50324e878a2f6a2740fa358b92
URL: http://source.winehq.org/git/wine.git/?a=commit;h=894a150f69ffbd50324e878a2f6a2740fa358b92
Author: Rico Schüller <kgbricola at web.de>
Date: Fri Jul 16 18:39:06 2010 +0200
wined3d: Add GL_NV_point_sprite extension.
---
dlls/wined3d/context.c | 34 +++++++++++++++++++++++++++++-----
dlls/wined3d/directx.c | 1 +
dlls/wined3d/drawprim.c | 4 +++-
dlls/wined3d/wined3d_gl.h | 16 ++++++++++++++++
4 files changed, 49 insertions(+), 6 deletions(-)
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index f21c805..8029f4f 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1484,8 +1484,19 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3
if (gl_info->supported[WINED3D_GL_VERSION_2_0])
{
- glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT);
- checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT)");
+ /* Windows doesn't support to query the glPointParameteri function pointer, so use the
+ * NV_POINT_SPRITE extension.
+ */
+ if (glPointParameteri)
+ {
+ glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT);
+ checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT)");
+ }
+ else if (gl_info->supported[NV_POINT_SPRITE])
+ {
+ GL_EXTCALL(glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT));
+ checkGLcall("glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, GL_UPPER_LEFT)");
+ }
}
if (gl_info->supported[ARB_PROVOKING_VERTEX])
@@ -1943,12 +1954,25 @@ void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer)
static inline void context_set_render_offscreen(struct wined3d_context *context, const struct StateEntry *StateTable,
BOOL offscreen)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
if (context->render_offscreen == offscreen) return;
- if (context->gl_info->supported[WINED3D_GL_VERSION_2_0])
+ if (gl_info->supported[WINED3D_GL_VERSION_2_0])
{
- glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, offscreen ? GL_LOWER_LEFT : GL_UPPER_LEFT);
- checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, ...)");
+ /* Windows doesn't support to query the glPointParameteri function pointer, so use the
+ * NV_POINT_SPRITE extension.
+ */
+ if (glPointParameteri)
+ {
+ glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, offscreen ? GL_LOWER_LEFT : GL_UPPER_LEFT);
+ checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, ...)");
+ }
+ else if (gl_info->supported[NV_POINT_SPRITE])
+ {
+ GL_EXTCALL(glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, offscreen ? GL_LOWER_LEFT : GL_UPPER_LEFT));
+ checkGLcall("glPointParameteriNV(GL_POINT_SPRITE_COORD_ORIGIN, ...)");
+ }
}
Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 0c4e994..8c744ff 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -138,6 +138,7 @@ static const struct {
{"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION, 0 },
{"GL_NV_half_float", NV_HALF_FLOAT, 0 },
{"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT, 0 },
+ {"GL_NV_point_sprite", NV_POINT_SPRITE, 0 },
{"GL_NV_register_combiners", NV_REGISTER_COMBINERS, 0 },
{"GL_NV_register_combiners2", NV_REGISTER_COMBINERS2, 0 },
{"GL_NV_texgen_reflection", NV_TEXGEN_REFLECTION, 0 },
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 304ab23..650ddf6 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -644,7 +644,9 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
}
}
- if (!context->gl_info->supported[WINED3D_GL_VERSION_2_0] && context->render_offscreen
+ if ((!context->gl_info->supported[WINED3D_GL_VERSION_2_0]
+ || (!glPointParameteri && !context->gl_info->supported[NV_POINT_SPRITE]))
+ && context->render_offscreen
&& This->stateBlock->renderState[WINED3DRS_POINTSPRITEENABLE]
&& This->stateBlock->gl_primitive_type == GL_POINTS)
{
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index b2dfddf..e069ae6 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -1818,6 +1818,7 @@ typedef enum wined3d_gl_extension
NV_FRAGMENT_PROGRAM_OPTION,
NV_HALF_FLOAT,
NV_LIGHT_MAX_EXPONENT,
+ NV_POINT_SPRITE,
NV_REGISTER_COMBINERS,
NV_REGISTER_COMBINERS2,
NV_TEXGEN_REFLECTION,
@@ -3482,6 +3483,16 @@ typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS4HVNVPROC)(GLuint index, GLsizei n,
#define GL_MAX_SPOT_EXPONENT_NV 0x8505
#endif
+/* GL_NV_point_sprite */
+#ifndef GL_NV_point_sprite
+#define GL_NV_point_sprite 1
+#define GL_NV_POINT_SPRITE_NV 0x8861
+#define GL_NV_COORD_REPLACE_NV 0x8862
+#define GL_NV_POINT_SPRITE_R_MODE_NV 0x8863
+#endif
+typedef void (WINE_GLAPI *PGLFNPOINTPARAMETERIVNVPROC)(GLenum pname, const GLint *params);
+typedef void (WINE_GLAPI *PGLFNPOINTPARAMETERINVPROC)(GLenum pname, GLint param);
+
/* GL_NV_register_combiners */
#ifndef GL_NV_register_combiners
#define GL_NV_register_combiners 1
@@ -4477,6 +4488,11 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
glVertexAttribs3hvNV, NV_HALF_FLOAT, NULL) \
USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, \
glVertexAttribs4hvNV, NV_HALF_FLOAT, NULL) \
+ /* GL_NV_point_sprite */ \
+ USE_GL_FUNC(PGLFNPOINTPARAMETERIVNVPROC, \
+ glPointParameterivNV, NV_POINT_SPRITE, NULL) \
+ USE_GL_FUNC(PGLFNPOINTPARAMETERINVPROC, \
+ glPointParameteriNV, NV_POINT_SPRITE, NULL) \
/* GL_NV_register_combiners */ \
USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, \
glCombinerInputNV, NV_REGISTER_COMBINERS, NULL) \
More information about the wine-cvs
mailing list