Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
aed9305c
Commit
aed9305c
authored
Nov 20, 2008
by
Stefan Dösinger
Committed by
Alexandre Julliard
Nov 25, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Store shader IDs in the vs and ps impl structures.
parent
dd890554
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
48 additions
and
28 deletions
+48
-28
arb_program_shader.c
dlls/wined3d/arb_program_shader.c
+26
-17
glsl_shader.c
dlls/wined3d/glsl_shader.c
+16
-10
wined3d_private.h
dlls/wined3d/wined3d_private.h
+6
-1
No files found.
dlls/wined3d/arb_program_shader.c
View file @
aed9305c
...
...
@@ -1878,7 +1878,7 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
TRACE
(
"Using vertex shader
\n
"
);
IWineD3DVertexShaderImpl_CompileShader
(
This
->
stateBlock
->
vertexShader
);
priv
->
current_vprogram_id
=
((
IWineD3DVertexShaderImpl
*
)
This
->
stateBlock
->
vertexShader
)
->
baseShader
.
prgId
;
priv
->
current_vprogram_id
=
((
IWineD3DVertexShaderImpl
*
)
This
->
stateBlock
->
vertexShader
)
->
prgId
;
/* Bind the vertex program */
GL_EXTCALL
(
glBindProgramARB
(
GL_VERTEX_PROGRAM_ARB
,
priv
->
current_vprogram_id
));
...
...
@@ -1900,7 +1900,7 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) {
find_ps_compile_args
((
IWineD3DPixelShaderImpl
*
)
This
->
stateBlock
->
pixelShader
,
This
->
stateBlock
,
&
compile_args
);
pixelshader_compile
(
This
->
stateBlock
->
pixelShader
,
&
compile_args
);
priv
->
current_fprogram_id
=
((
IWineD3DPixelShaderImpl
*
)
This
->
stateBlock
->
pixelShader
)
->
baseShader
.
prgId
;
priv
->
current_fprogram_id
=
((
IWineD3DPixelShaderImpl
*
)
This
->
stateBlock
->
pixelShader
)
->
prgId
;
/* Bind the fragment program */
GL_EXTCALL
(
glBindProgramARB
(
GL_FRAGMENT_PROGRAM_ARB
,
priv
->
current_fprogram_id
));
...
...
@@ -1980,12 +1980,21 @@ static void shader_arb_cleanup(IWineD3DDevice *iface) {
static
void
shader_arb_destroy
(
IWineD3DBaseShader
*
iface
)
{
IWineD3DBaseShaderImpl
*
This
=
(
IWineD3DBaseShaderImpl
*
)
iface
;
WineD3D_GL_Info
*
gl_info
=
&
((
IWineD3DDeviceImpl
*
)
This
->
baseShader
.
device
)
->
adapter
->
gl_info
;
char
pshader
=
shader_is_pshader_version
(
This
->
baseShader
.
hex_version
);
ENTER_GL
();
GL_EXTCALL
(
glDeleteProgramsARB
(
1
,
&
This
->
baseShader
.
prgId
));
checkGLcall
(
"GL_EXTCALL(glDeleteProgramsARB(1, &This->baseShader.prgId))"
);
LEAVE_GL
();
This
->
baseShader
.
prgId
=
0
;
if
(
pshader
)
{
ENTER_GL
();
GL_EXTCALL
(
glDeleteProgramsARB
(
1
,
&
((
IWineD3DPixelShaderImpl
*
)
This
)
->
prgId
));
checkGLcall
(
"GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DPixelShaderImpl *) This)->prgId))"
);
((
IWineD3DPixelShaderImpl
*
)
This
)
->
prgId
=
0
;
LEAVE_GL
();
}
else
{
ENTER_GL
();
GL_EXTCALL
(
glDeleteProgramsARB
(
1
,
&
((
IWineD3DVertexShaderImpl
*
)
This
)
->
prgId
));
checkGLcall
(
"GL_EXTCALL(glDeleteProgramsARB(1, &((IWineD3DPixelShaderImpl *) This)->prgId))"
);
((
IWineD3DVertexShaderImpl
*
)
This
)
->
prgId
=
0
;
LEAVE_GL
();
}
This
->
baseShader
.
is_compiled
=
FALSE
;
}
...
...
@@ -2093,12 +2102,12 @@ static void shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE
shader_addline
(
buffer
,
"END
\n
"
);
/* TODO: change to resource.glObjectHandle or something like that */
GL_EXTCALL
(
glGenProgramsARB
(
1
,
&
This
->
baseShader
.
prgId
));
GL_EXTCALL
(
glGenProgramsARB
(
1
,
&
This
->
prgId
));
TRACE
(
"Creating a hw pixel shader, prg=%d
\n
"
,
This
->
baseShader
.
prgId
);
GL_EXTCALL
(
glBindProgramARB
(
GL_FRAGMENT_PROGRAM_ARB
,
This
->
baseShader
.
prgId
));
TRACE
(
"Creating a hw pixel shader, prg=%d
\n
"
,
This
->
prgId
);
GL_EXTCALL
(
glBindProgramARB
(
GL_FRAGMENT_PROGRAM_ARB
,
This
->
prgId
));
TRACE
(
"Created hw pixel shader, prg=%d
\n
"
,
This
->
baseShader
.
prgId
);
TRACE
(
"Created hw pixel shader, prg=%d
\n
"
,
This
->
prgId
);
/* Create the program and check for errors */
GL_EXTCALL
(
glProgramStringARB
(
GL_FRAGMENT_PROGRAM_ARB
,
GL_PROGRAM_FORMAT_ASCII_ARB
,
buffer
->
bsize
,
buffer
->
buffer
));
...
...
@@ -2108,7 +2117,7 @@ static void shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFE
glGetIntegerv
(
GL_PROGRAM_ERROR_POSITION_ARB
,
&
errPos
);
FIXME
(
"HW PixelShader Error at position %d: %s
\n
"
,
errPos
,
debugstr_a
((
const
char
*
)
glGetString
(
GL_PROGRAM_ERROR_STRING_ARB
)));
This
->
baseShader
.
prgId
=
-
1
;
This
->
prgId
=
-
1
;
}
/* Load immediate constants */
...
...
@@ -2199,12 +2208,12 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF
shader_addline
(
buffer
,
"END
\n
"
);
/* TODO: change to resource.glObjectHandle or something like that */
GL_EXTCALL
(
glGenProgramsARB
(
1
,
&
This
->
baseShader
.
prgId
));
GL_EXTCALL
(
glGenProgramsARB
(
1
,
&
This
->
prgId
));
TRACE
(
"Creating a hw vertex shader, prg=%d
\n
"
,
This
->
baseShader
.
prgId
);
GL_EXTCALL
(
glBindProgramARB
(
GL_VERTEX_PROGRAM_ARB
,
This
->
baseShader
.
prgId
));
TRACE
(
"Creating a hw vertex shader, prg=%d
\n
"
,
This
->
prgId
);
GL_EXTCALL
(
glBindProgramARB
(
GL_VERTEX_PROGRAM_ARB
,
This
->
prgId
));
TRACE
(
"Created hw vertex shader, prg=%d
\n
"
,
This
->
baseShader
.
prgId
);
TRACE
(
"Created hw vertex shader, prg=%d
\n
"
,
This
->
prgId
);
/* Create the program and check for errors */
GL_EXTCALL
(
glProgramStringARB
(
GL_VERTEX_PROGRAM_ARB
,
GL_PROGRAM_FORMAT_ASCII_ARB
,
buffer
->
bsize
,
buffer
->
buffer
));
...
...
@@ -2214,7 +2223,7 @@ static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFF
glGetIntegerv
(
GL_PROGRAM_ERROR_POSITION_ARB
,
&
errPos
);
FIXME
(
"HW VertexShader Error at position %d: %s
\n
"
,
errPos
,
debugstr_a
((
const
char
*
)
glGetString
(
GL_PROGRAM_ERROR_STRING_ARB
)));
This
->
baseShader
.
prgId
=
-
1
;
This
->
prgId
=
-
1
;
}
/* Load immediate constants */
...
...
dlls/wined3d/glsl_shader.c
View file @
aed9305c
...
...
@@ -3229,7 +3229,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
if
(
use_vs
)
{
IWineD3DVertexShaderImpl_CompileShader
(
vshader
);
vshader_id
=
((
IWineD3D
BaseShaderImpl
*
)
vshader
)
->
baseShader
.
prgId
;
vshader_id
=
((
IWineD3D
VertexShaderImpl
*
)
vshader
)
->
prgId
;
}
else
{
vshader_id
=
0
;
}
...
...
@@ -3237,7 +3237,7 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use
struct
ps_compile_args
compile_args
;
find_ps_compile_args
((
IWineD3DPixelShaderImpl
*
)
This
->
stateBlock
->
pixelShader
,
This
->
stateBlock
,
&
compile_args
);
pixelshader_compile
(
pshader
,
&
compile_args
);
pshader_id
=
((
IWineD3D
BaseShaderImpl
*
)
pshader
)
->
baseShader
.
prgId
;
pshader_id
=
((
IWineD3D
PixelShaderImpl
*
)
pshader
)
->
prgId
;
}
else
{
pshader_id
=
0
;
}
...
...
@@ -3535,13 +3535,19 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
IWineD3DDeviceImpl
*
device
=
(
IWineD3DDeviceImpl
*
)
This
->
baseShader
.
device
;
struct
shader_glsl_priv
*
priv
=
(
struct
shader_glsl_priv
*
)
device
->
shader_priv
;
WineD3D_GL_Info
*
gl_info
=
&
device
->
adapter
->
gl_info
;
GLuint
*
prog
;
/* Note: Do not use QueryInterface here to find out which shader type this is because this code
* can be called from IWineD3DBaseShader::Release
*/
char
pshader
=
shader_is_pshader_version
(
This
->
baseShader
.
hex_version
);
if
(
This
->
baseShader
.
prgId
==
0
)
return
;
if
(
pshader
)
{
prog
=
&
((
IWineD3DPixelShaderImpl
*
)
This
)
->
prgId
;
}
else
{
prog
=
&
((
IWineD3DVertexShaderImpl
*
)
This
)
->
prgId
;
}
if
(
*
prog
==
0
)
return
;
linked_programs
=
&
This
->
baseShader
.
linked_programs
;
TRACE
(
"Deleting linked programs
\n
"
);
...
...
@@ -3559,10 +3565,10 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
}
}
TRACE
(
"Deleting shader object %u
\n
"
,
This
->
baseShader
.
prgId
);
GL_EXTCALL
(
glDeleteObjectARB
(
This
->
baseShader
.
prgId
));
TRACE
(
"Deleting shader object %u
\n
"
,
*
prog
);
GL_EXTCALL
(
glDeleteObjectARB
(
*
prog
));
checkGLcall
(
"glDeleteObjectARB"
);
This
->
baseShader
.
prgId
=
0
;
*
prog
=
0
;
This
->
baseShader
.
is_compiled
=
FALSE
;
}
...
...
@@ -3627,7 +3633,7 @@ static void shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFF
const
char
*
fragcolor
;
WineD3D_GL_Info
*
gl_info
=
&
((
IWineD3DDeviceImpl
*
)
This
->
baseShader
.
device
)
->
adapter
->
gl_info
;
/* Create the hw GLSL shader object and assign it as the
baseShader.
prgId */
/* Create the hw GLSL shader object and assign it as the
shader->
prgId */
GLhandleARB
shader_obj
=
GL_EXTCALL
(
glCreateShaderObjectARB
(
GL_FRAGMENT_SHADER_ARB
));
shader_addline
(
buffer
,
"#version 120
\n
"
);
...
...
@@ -3705,7 +3711,7 @@ static void shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFF
print_glsl_info_log
(
&
GLINFO_LOCATION
,
shader_obj
);
/* Store the shader object */
This
->
baseShader
.
prgId
=
shader_obj
;
This
->
prgId
=
shader_obj
;
}
static
void
shader_glsl_generate_vshader
(
IWineD3DVertexShader
*
iface
,
SHADER_BUFFER
*
buffer
)
{
...
...
@@ -3714,7 +3720,7 @@ static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF
CONST
DWORD
*
function
=
This
->
baseShader
.
function
;
WineD3D_GL_Info
*
gl_info
=
&
((
IWineD3DDeviceImpl
*
)
This
->
baseShader
.
device
)
->
adapter
->
gl_info
;
/* Create the hw GLSL shader program and assign it as the
baseShader.
prgId */
/* Create the hw GLSL shader program and assign it as the
shader->
prgId */
GLhandleARB
shader_obj
=
GL_EXTCALL
(
glCreateShaderObjectARB
(
GL_VERTEX_SHADER_ARB
));
shader_addline
(
buffer
,
"#version 120
\n
"
);
...
...
@@ -3762,7 +3768,7 @@ static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUF
print_glsl_info_log
(
&
GLINFO_LOCATION
,
shader_obj
);
/* Store the shader object */
This
->
baseShader
.
prgId
=
shader_obj
;
This
->
prgId
=
shader_obj
;
}
static
void
shader_glsl_get_caps
(
WINED3DDEVTYPE
devtype
,
WineD3D_GL_Info
*
gl_info
,
struct
shader_caps
*
pCaps
)
{
...
...
dlls/wined3d/wined3d_private.h
View file @
aed9305c
...
...
@@ -2138,7 +2138,6 @@ typedef struct IWineD3DBaseShaderClass
CONST
SHADER_OPCODE
*
shader_ins
;
DWORD
*
function
;
UINT
functionLength
;
GLuint
prgId
;
BOOL
is_compiled
;
UINT
cur_loop_depth
,
cur_loop_regno
;
BOOL
load_local_constsF
;
...
...
@@ -2305,6 +2304,9 @@ typedef struct IWineD3DVertexShaderImpl {
DWORD
usage
;
/* The GL shader */
GLuint
prgId
;
/* Vertex shader input and output semantics */
semantic
semantics_in
[
MAX_ATTRIBS
];
semantic
semantics_out
[
MAX_REG_OUTPUT
];
...
...
@@ -2362,6 +2364,9 @@ typedef struct IWineD3DPixelShaderImpl {
BOOL
input_reg_used
[
MAX_REG_INPUT
];
int
declared_in_count
;
/* The GL shader */
GLuint
prgId
;
/* Some information about the shader behavior */
struct
stb_const_desc
bumpenvmatconst
[
MAX_TEXTURES
];
char
numbumpenvmatconsts
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment