Stefan Dösinger : wined3d: Add NV asm extension support to the ARB backend.
Alexandre Julliard
julliard at winehq.org
Thu May 21 09:35:52 CDT 2009
Module: wine
Branch: master
Commit: 01ec5068e2d3451610878b9b0ae985d16d605a21
URL: http://source.winehq.org/git/wine.git/?a=commit;h=01ec5068e2d3451610878b9b0ae985d16d605a21
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri May 8 18:02:27 2009 +0200
wined3d: Add NV asm extension support to the ARB backend.
---
dlls/wined3d/arb_program_shader.c | 25 ++++++++++++++++++++++++-
dlls/wined3d/directx.c | 2 ++
dlls/wined3d/wined3d_gl.h | 9 +++++++++
3 files changed, 35 insertions(+), 1 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 6c74169..7e56175 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -86,6 +86,14 @@ struct shader_arb_priv {
struct shader_arb_ctx_priv {
char addr_reg[20];
+ enum {
+ /* plain GL_ARB_vertex_program or GL_ARB_fragment_program */
+ ARB,
+ /* GL_NV_vertex_progam2_option or GL_NV_fragment_program_option */
+ NV2,
+ /* GL_NV_vertex_program3 or GL_NV_fragment_program2 */
+ NV3
+ } target_version;
};
/********************************************************
@@ -1979,9 +1987,17 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface,
GLuint retval;
const char *fragcolor;
DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This);
+ struct shader_arb_ctx_priv priv_ctx;
/* Create the hw ARB shader */
+ memset(&priv_ctx, 0, sizeof(priv_ctx));
shader_addline(buffer, "!!ARBfp1.0\n");
+ if(GL_SUPPORT(NV_FRAGMENT_PROGRAM_OPTION)) {
+ shader_addline(buffer, "OPTION NV_fragment_program;\n");
+ priv_ctx.target_version = NV2;
+ } else {
+ priv_ctx.target_version = ARB;
+ }
if (reg_maps->shader_version.major < 3)
{
@@ -2023,7 +2039,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface,
shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map);
/* Base Shader Body */
- shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function, NULL);
+ shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function, &priv_ctx);
if(args->srgb_correction) {
arbfp_add_sRGB_correction(buffer, fragcolor, "TA", "TB", "TC");
@@ -2083,6 +2099,13 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface,
/* Create the hw ARB shader */
shader_addline(buffer, "!!ARBvp1.0\n");
+ if(GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION)) {
+ shader_addline(buffer, "OPTION NV_vertex_program2;\n");
+ priv_ctx.target_version = NV2;
+ } else {
+ priv_ctx.target_version = ARB;
+ }
+
if(need_helper_const(gl_info)) {
shader_addline(buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset);
}
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 94c5f6a..46c1556 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -140,7 +140,9 @@ static const struct {
{"GL_NV_vertex_program", NV_VERTEX_PROGRAM, 0 },
{"GL_NV_vertex_program1_1", NV_VERTEX_PROGRAM1_1, 0 },
{"GL_NV_vertex_program2", NV_VERTEX_PROGRAM2, 0 },
+ {"GL_NV_vertex_program2_option", NV_VERTEX_PROGRAM2_OPTION, 0 },
{"GL_NV_vertex_program3", NV_VERTEX_PROGRAM3, 0 },
+ {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION, 0 },
{"GL_NV_depth_clamp", NV_DEPTH_CLAMP, 0 },
{"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT, 0 },
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index 1a615c1..a36d9c5 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -3080,6 +3080,13 @@ typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI) (GLuint dst, const
#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE
#endif
+/* GL_NV_vertex_program2_option */
+#ifndef GL_NV_vertex_program2_option
+#define GL_NV_vertex_program2_option
+#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4
+#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5
+#endif
+
/* GL_VERSION_2_0 */
#ifndef GL_VERSION_2_0
#define GL_VERSION_2_0 1
@@ -3450,7 +3457,9 @@ typedef enum _GL_SupportedExt {
NV_VERTEX_PROGRAM,
NV_VERTEX_PROGRAM1_1,
NV_VERTEX_PROGRAM2,
+ NV_VERTEX_PROGRAM2_OPTION,
NV_VERTEX_PROGRAM3,
+ NV_FRAGMENT_PROGRAM_OPTION,
NV_FENCE,
NV_DEPTH_CLAMP,
NV_LIGHT_MAX_EXPONENT,
More information about the wine-cvs
mailing list