Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
2a5a6a34
Commit
2a5a6a34
authored
May 05, 2009
by
Henri Verbeet
Committed by
Alexandre Julliard
May 05, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Store the SM 1-3 opcode information tables in the SM 1-3 frontend.
parent
15a2a5ee
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
80 additions
and
135 deletions
+80
-135
arb_program_shader.c
dlls/wined3d/arb_program_shader.c
+4
-4
baseshader.c
dlls/wined3d/baseshader.c
+16
-20
device.c
dlls/wined3d/device.c
+2
-2
glsl_shader.c
dlls/wined3d/glsl_shader.c
+4
-4
pixelshader.c
dlls/wined3d/pixelshader.c
+0
-0
shader_sm1.c
dlls/wined3d/shader_sm1.c
+0
-0
shader_sm4.c
dlls/wined3d/shader_sm4.c
+26
-2
vertexshader.c
dlls/wined3d/vertexshader.c
+9
-78
wined3d_private.h
dlls/wined3d/wined3d_private.h
+19
-25
No files found.
dlls/wined3d/arb_program_shader.c
View file @
2a5a6a34
...
...
@@ -1975,7 +1975,7 @@ static void arbfp_add_sRGB_correction(SHADER_BUFFER *buffer, const char *fragcol
/* [0.0;1.0] clamping. Not needed, this is done implicitly */
}
static
GLuint
shader_arb_generate_pshader
(
IWineD3DPixelShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
static
GLuint
shader_arb_generate_pshader
(
IWineD3DPixelShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
ps_compile_args
*
args
)
{
IWineD3DPixelShaderImpl
*
This
=
(
IWineD3DPixelShaderImpl
*
)
iface
;
...
...
@@ -2026,7 +2026,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface, const stru
shader_generate_arb_declarations
(
(
IWineD3DBaseShader
*
)
This
,
reg_maps
,
buffer
,
&
GLINFO_LOCATION
);
/* Base Shader Body */
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
fe
,
reg_maps
,
function
);
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
reg_maps
,
function
);
if
(
args
->
srgb_correction
)
{
arbfp_add_sRGB_correction
(
buffer
,
fragcolor
,
"TMP"
,
"TMP2"
,
"TA"
,
"TB"
);
...
...
@@ -2065,7 +2065,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShader *iface, const stru
return
retval
;
}
static
GLuint
shader_arb_generate_vshader
(
IWineD3DVertexShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
static
GLuint
shader_arb_generate_vshader
(
IWineD3DVertexShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
vs_compile_args
*
args
)
{
IWineD3DVertexShaderImpl
*
This
=
(
IWineD3DVertexShaderImpl
*
)
iface
;
...
...
@@ -2119,7 +2119,7 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface, const str
}
/* Base Shader Body */
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
fe
,
reg_maps
,
function
);
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
reg_maps
,
function
);
/* The D3DRS_FOGTABLEMODE render state defines if the shader-generated fog coord is used
* or if the fragment depth is used. If the fragment depth is used(FOGTABLEMODE != NONE),
...
...
dlls/wined3d/baseshader.c
View file @
2a5a6a34
...
...
@@ -119,12 +119,6 @@ static const char *shader_opcode_names[] =
/* WINED3DSIH_TEXREG2RGB */
"texreg2rgb"
,
};
#define WINED3D_SM1_VS 0xfffe
#define WINED3D_SM1_PS 0xffff
#define WINED3D_SM4_PS 0x0000
#define WINED3D_SM4_VS 0x0001
#define WINED3D_SM4_GS 0x0002
const
struct
wined3d_shader_frontend
*
shader_select_frontend
(
DWORD
version_token
)
{
switch
(
version_token
>>
16
)
...
...
@@ -206,12 +200,10 @@ int shader_addline(SHADER_BUFFER* buffer, const char *format, ...)
return
ret
;
}
void
shader_init
(
struct
IWineD3DBaseShaderClass
*
shader
,
IWineD3DDevice
*
device
,
const
SHADER_OPCODE
*
instruction_table
)
void
shader_init
(
struct
IWineD3DBaseShaderClass
*
shader
,
IWineD3DDevice
*
device
)
{
shader
->
ref
=
1
;
shader
->
device
=
device
;
shader
->
shader_ins
=
instruction_table
;
list_init
(
&
shader
->
linked_programs
);
}
...
...
@@ -325,7 +317,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
struct
wined3d_shader_semantic
*
semantics_out
,
const
DWORD
*
byte_code
)
{
IWineD3DBaseShaderImpl
*
This
=
(
IWineD3DBaseShaderImpl
*
)
iface
;
const
SHADER_OPCODE
*
shader_ins
=
This
->
baseShader
.
shader_ins
;
void
*
fe_data
=
This
->
baseShader
.
frontend_data
;
DWORD
shader_version
;
unsigned
int
cur_loop_depth
=
0
,
max_loop_depth
=
0
;
const
DWORD
*
pToken
=
byte_code
;
...
...
@@ -357,7 +349,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
if
(
comment
)
continue
;
/* Fetch opcode */
fe
->
shader_read_opcode
(
&
pToken
,
&
ins
,
&
param_size
,
shader_ins
,
shader_version
);
fe
->
shader_read_opcode
(
fe_data
,
&
pToken
,
&
ins
,
&
param_size
,
shader_version
);
/* Unhandled opcode, and its parameters */
if
(
ins
.
handler_idx
==
WINED3DSIH_TABLE_SIZE
)
...
...
@@ -856,13 +848,13 @@ void shader_dump_src_param(const struct wined3d_shader_src_param *param, DWORD s
/* Shared code in order to generate the bulk of the shader string.
* NOTE: A description of how to parse tokens can be found on msdn */
void
shader_generate_main
(
IWineD3DBaseShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
wined3d_shader_frontend
*
fe
,
const
shader_reg_maps
*
reg_maps
,
const
DWORD
*
pFunction
)
const
shader_reg_maps
*
reg_maps
,
const
DWORD
*
pFunction
)
{
IWineD3DBaseShaderImpl
*
This
=
(
IWineD3DBaseShaderImpl
*
)
iface
;
IWineD3DDeviceImpl
*
device
=
(
IWineD3DDeviceImpl
*
)
This
->
baseShader
.
device
;
/* To access shader backend callbacks */
const
SHADER_OPCODE
*
opcode_table
=
This
->
baseShader
.
shader_ins
;
const
SHADER_HANDLER
*
handler_table
=
device
->
shader_backend
->
shader_instruction_handler_table
;
const
struct
wined3d_shader_frontend
*
fe
=
This
->
baseShader
.
frontend
;
void
*
fe_data
=
This
->
baseShader
.
frontend_data
;
struct
wined3d_shader_src_param
src_rel_addr
[
4
];
struct
wined3d_shader_src_param
src_param
[
4
];
struct
wined3d_shader_src_param
dst_rel_addr
;
...
...
@@ -896,7 +888,7 @@ void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER *buffer,
if
(
comment
)
continue
;
/* Read opcode */
fe
->
shader_read_opcode
(
&
pToken
,
&
ins
,
&
param_size
,
opcode_tabl
e
,
shader_version
);
fe
->
shader_read_opcode
(
fe_data
,
&
pToken
,
&
ins
,
&
param_siz
e
,
shader_version
);
/* Unknown opcode and its parameters */
if
(
ins
.
handler_idx
==
WINED3DSIH_TABLE_SIZE
)
...
...
@@ -977,8 +969,7 @@ static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst
FIXME
(
"_unrecognized_modifier(%#x)"
,
mmask
);
}
void
shader_trace_init
(
const
struct
wined3d_shader_frontend
*
fe
,
const
DWORD
*
pFunction
,
const
SHADER_OPCODE
*
opcode_table
)
void
shader_trace_init
(
const
struct
wined3d_shader_frontend
*
fe
,
void
*
fe_data
,
const
DWORD
*
pFunction
)
{
const
DWORD
*
pToken
=
pFunction
;
DWORD
shader_version
;
...
...
@@ -1005,7 +996,7 @@ void shader_trace_init(const struct wined3d_shader_frontend *fe,
continue
;
}
fe
->
shader_read_opcode
(
&
pToken
,
&
ins
,
&
param_size
,
opcode_tabl
e
,
shader_version
);
fe
->
shader_read_opcode
(
fe_data
,
&
pToken
,
&
ins
,
&
param_siz
e
,
shader_version
);
if
(
ins
.
handler_idx
==
WINED3DSIH_TABLE_SIZE
)
{
TRACE
(
"Skipping unrecognized instruction.
\n
"
);
...
...
@@ -1139,6 +1130,11 @@ void shader_cleanup(IWineD3DBaseShader *iface)
shader_delete_constant_list
(
&
This
->
baseShader
.
constantsB
);
shader_delete_constant_list
(
&
This
->
baseShader
.
constantsI
);
list_remove
(
&
This
->
baseShader
.
shader_list_entry
);
if
(
This
->
baseShader
.
frontend
&&
This
->
baseShader
.
frontend_data
)
{
This
->
baseShader
.
frontend
->
shader_free
(
This
->
baseShader
.
frontend_data
);
}
}
static
const
SHADER_HANDLER
shader_none_instruction_handler_table
[
WINED3DSIH_TABLE_SIZE
]
=
{
0
};
...
...
@@ -1153,13 +1149,13 @@ static void shader_none_destroy(IWineD3DBaseShader *iface) {}
static
HRESULT
shader_none_alloc
(
IWineD3DDevice
*
iface
)
{
return
WINED3D_OK
;}
static
void
shader_none_free
(
IWineD3DDevice
*
iface
)
{}
static
BOOL
shader_none_dirty_const
(
IWineD3DDevice
*
iface
)
{
return
FALSE
;}
static
GLuint
shader_none_generate_pshader
(
IWineD3DPixelShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
static
GLuint
shader_none_generate_pshader
(
IWineD3DPixelShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
ps_compile_args
*
args
)
{
FIXME
(
"NONE shader backend asked to generate a pixel shader
\n
"
);
return
0
;
}
static
GLuint
shader_none_generate_vshader
(
IWineD3DVertexShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
static
GLuint
shader_none_generate_vshader
(
IWineD3DVertexShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
vs_compile_args
*
args
)
{
FIXME
(
"NONE shader backend asked to generate a vertex shader
\n
"
);
...
...
dlls/wined3d/device.c
View file @
2a5a6a34
...
...
@@ -2344,7 +2344,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexShader(IWineD3DDevice *ifac
object
->
lpVtbl
=
&
IWineD3DVertexShader_Vtbl
;
object
->
parent
=
parent
;
shader_init
(
&
object
->
baseShader
,
iface
,
IWineD3DVertexShaderImpl_shader_ins
);
shader_init
(
&
object
->
baseShader
,
iface
);
list_add_head
(
&
This
->
shaders
,
&
object
->
baseShader
.
shader_list_entry
);
*
ppVertexShader
=
(
IWineD3DVertexShader
*
)
object
;
...
...
@@ -2383,7 +2383,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreatePixelShader(IWineD3DDevice *iface
object
->
lpVtbl
=
&
IWineD3DPixelShader_Vtbl
;
object
->
parent
=
parent
;
shader_init
(
&
object
->
baseShader
,
iface
,
IWineD3DPixelShaderImpl_shader_ins
);
shader_init
(
&
object
->
baseShader
,
iface
);
list_add_head
(
&
This
->
shaders
,
&
object
->
baseShader
.
shader_list_entry
);
*
ppPixelShader
=
(
IWineD3DPixelShader
*
)
object
;
...
...
dlls/wined3d/glsl_shader.c
View file @
2a5a6a34
...
...
@@ -3984,7 +3984,7 @@ static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) {
return
FALSE
;
}
static
GLuint
shader_glsl_generate_pshader
(
IWineD3DPixelShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
static
GLuint
shader_glsl_generate_pshader
(
IWineD3DPixelShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
ps_compile_args
*
args
)
{
IWineD3DPixelShaderImpl
*
This
=
(
IWineD3DPixelShaderImpl
*
)
iface
;
...
...
@@ -4017,7 +4017,7 @@ static GLuint shader_glsl_generate_pshader(IWineD3DPixelShader *iface, const str
}
/* Base Shader Body */
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
fe
,
reg_maps
,
function
);
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
reg_maps
,
function
);
/* Pixel shaders < 2.0 place the resulting color in R0 implicitly */
if
(
reg_maps
->
shader_version
<
WINED3DPS_VERSION
(
2
,
0
))
...
...
@@ -4085,7 +4085,7 @@ static GLuint shader_glsl_generate_pshader(IWineD3DPixelShader *iface, const str
return
shader_obj
;
}
static
GLuint
shader_glsl_generate_vshader
(
IWineD3DVertexShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
static
GLuint
shader_glsl_generate_vshader
(
IWineD3DVertexShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
vs_compile_args
*
args
)
{
IWineD3DVertexShaderImpl
*
This
=
(
IWineD3DVertexShaderImpl
*
)
iface
;
...
...
@@ -4102,7 +4102,7 @@ static GLuint shader_glsl_generate_vshader(IWineD3DVertexShader *iface, const st
shader_generate_glsl_declarations
(
(
IWineD3DBaseShader
*
)
This
,
reg_maps
,
buffer
,
&
GLINFO_LOCATION
,
NULL
);
/* Base Shader Body */
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
fe
,
reg_maps
,
function
);
shader_generate_main
((
IWineD3DBaseShader
*
)
This
,
buffer
,
reg_maps
,
function
);
/* Unpack 3.0 outputs */
if
(
reg_maps
->
shader_version
>=
WINED3DVS_VERSION
(
3
,
0
))
shader_addline
(
buffer
,
"order_ps_input(OUT);
\n
"
);
...
...
dlls/wined3d/pixelshader.c
View file @
2a5a6a34
This diff is collapsed.
Click to expand it.
dlls/wined3d/shader_sm1.c
View file @
2a5a6a34
This diff is collapsed.
Click to expand it.
dlls/wined3d/shader_sm4.c
View file @
2a5a6a34
...
...
@@ -28,6 +28,28 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
#define WINED3D_SM4_OPCODE_MASK 0xff
struct
wined3d_sm4_data
{
/* We don't store a lot in here yet. */
};
static
void
*
shader_sm4_init
(
const
DWORD
*
byte_code
)
{
struct
wined3d_sm4_data
*
priv
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
priv
));
if
(
!
priv
)
{
ERR
(
"Failed to allocate private data
\n
"
);
return
NULL
;
}
return
priv
;
}
static
void
shader_sm4_free
(
void
*
data
)
{
HeapFree
(
GetProcessHeap
(),
0
,
data
);
}
static
void
shader_sm4_read_header
(
const
DWORD
**
ptr
,
DWORD
*
shader_version
)
{
TRACE
(
"version: 0x%08x
\n
"
,
**
ptr
);
...
...
@@ -36,8 +58,8 @@ static void shader_sm4_read_header(const DWORD **ptr, DWORD *shader_version)
++
(
*
ptr
);
}
static
void
shader_sm4_read_opcode
(
const
DWORD
**
ptr
,
struct
wined3d_shader_instruction
*
ins
,
UINT
*
param_size
,
const
SHADER_OPCODE
*
opcode_table
,
DWORD
shader_version
)
static
void
shader_sm4_read_opcode
(
void
*
data
,
const
DWORD
**
ptr
,
struct
wined3d_shader_instruction
*
ins
,
UINT
*
param_size
,
DWORD
shader_version
)
{
DWORD
token
=
*
(
*
ptr
)
++
;
DWORD
opcode
=
token
&
WINED3D_SM4_OPCODE_MASK
;
...
...
@@ -86,6 +108,8 @@ static BOOL shader_sm4_is_end(const DWORD **ptr)
const
struct
wined3d_shader_frontend
sm4_shader_frontend
=
{
shader_sm4_init
,
shader_sm4_free
,
shader_sm4_read_header
,
shader_sm4_read_opcode
,
shader_sm4_read_src_param
,
...
...
dlls/wined3d/vertexshader.c
View file @
2a5a6a34
...
...
@@ -34,74 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
#define GLINFO_LOCATION ((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info
/* This table is not order or position dependent. */
const
SHADER_OPCODE
IWineD3DVertexShaderImpl_shader_ins
[]
=
{
/* Arithmetic */
{
WINED3DSIO_NOP
,
0
,
0
,
WINED3DSIH_NOP
,
0
,
0
},
{
WINED3DSIO_MOV
,
1
,
2
,
WINED3DSIH_MOV
,
0
,
0
},
{
WINED3DSIO_MOVA
,
1
,
2
,
WINED3DSIH_MOVA
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_ADD
,
1
,
3
,
WINED3DSIH_ADD
,
0
,
0
},
{
WINED3DSIO_SUB
,
1
,
3
,
WINED3DSIH_SUB
,
0
,
0
},
{
WINED3DSIO_MAD
,
1
,
4
,
WINED3DSIH_MAD
,
0
,
0
},
{
WINED3DSIO_MUL
,
1
,
3
,
WINED3DSIH_MUL
,
0
,
0
},
{
WINED3DSIO_RCP
,
1
,
2
,
WINED3DSIH_RCP
,
0
,
0
},
{
WINED3DSIO_RSQ
,
1
,
2
,
WINED3DSIH_RSQ
,
0
,
0
},
{
WINED3DSIO_DP3
,
1
,
3
,
WINED3DSIH_DP3
,
0
,
0
},
{
WINED3DSIO_DP4
,
1
,
3
,
WINED3DSIH_DP4
,
0
,
0
},
{
WINED3DSIO_MIN
,
1
,
3
,
WINED3DSIH_MIN
,
0
,
0
},
{
WINED3DSIO_MAX
,
1
,
3
,
WINED3DSIH_MAX
,
0
,
0
},
{
WINED3DSIO_SLT
,
1
,
3
,
WINED3DSIH_SLT
,
0
,
0
},
{
WINED3DSIO_SGE
,
1
,
3
,
WINED3DSIH_SGE
,
0
,
0
},
{
WINED3DSIO_ABS
,
1
,
2
,
WINED3DSIH_ABS
,
0
,
0
},
{
WINED3DSIO_EXP
,
1
,
2
,
WINED3DSIH_EXP
,
0
,
0
},
{
WINED3DSIO_LOG
,
1
,
2
,
WINED3DSIH_LOG
,
0
,
0
},
{
WINED3DSIO_EXPP
,
1
,
2
,
WINED3DSIH_EXPP
,
0
,
0
},
{
WINED3DSIO_LOGP
,
1
,
2
,
WINED3DSIH_LOGP
,
0
,
0
},
{
WINED3DSIO_LIT
,
1
,
2
,
WINED3DSIH_LIT
,
0
,
0
},
{
WINED3DSIO_DST
,
1
,
3
,
WINED3DSIH_DST
,
0
,
0
},
{
WINED3DSIO_LRP
,
1
,
4
,
WINED3DSIH_LRP
,
0
,
0
},
{
WINED3DSIO_FRC
,
1
,
2
,
WINED3DSIH_FRC
,
0
,
0
},
{
WINED3DSIO_POW
,
1
,
3
,
WINED3DSIH_POW
,
0
,
0
},
{
WINED3DSIO_CRS
,
1
,
3
,
WINED3DSIH_CRS
,
0
,
0
},
{
WINED3DSIO_SGN
,
1
,
2
,
WINED3DSIH_SGN
,
0
,
0
},
{
WINED3DSIO_NRM
,
1
,
2
,
WINED3DSIH_NRM
,
0
,
0
},
{
WINED3DSIO_SINCOS
,
1
,
4
,
WINED3DSIH_SINCOS
,
WINED3DVS_VERSION
(
2
,
0
),
WINED3DVS_VERSION
(
2
,
1
)},
{
WINED3DSIO_SINCOS
,
1
,
2
,
WINED3DSIH_SINCOS
,
WINED3DVS_VERSION
(
3
,
0
),
-
1
},
/* Matrix */
{
WINED3DSIO_M4x4
,
1
,
3
,
WINED3DSIH_M4x4
,
0
,
0
},
{
WINED3DSIO_M4x3
,
1
,
3
,
WINED3DSIH_M4x3
,
0
,
0
},
{
WINED3DSIO_M3x4
,
1
,
3
,
WINED3DSIH_M3x4
,
0
,
0
},
{
WINED3DSIO_M3x3
,
1
,
3
,
WINED3DSIH_M3x3
,
0
,
0
},
{
WINED3DSIO_M3x2
,
1
,
3
,
WINED3DSIH_M3x2
,
0
,
0
},
/* Declare registers */
{
WINED3DSIO_DCL
,
0
,
2
,
WINED3DSIH_DCL
,
0
,
0
},
/* Constant definitions */
{
WINED3DSIO_DEF
,
1
,
5
,
WINED3DSIH_DEF
,
0
,
0
},
{
WINED3DSIO_DEFB
,
1
,
2
,
WINED3DSIH_DEFB
,
0
,
0
},
{
WINED3DSIO_DEFI
,
1
,
5
,
WINED3DSIH_DEFI
,
0
,
0
},
/* Flow control */
{
WINED3DSIO_REP
,
0
,
1
,
WINED3DSIH_REP
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_ENDREP
,
0
,
0
,
WINED3DSIH_ENDREP
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_IF
,
0
,
1
,
WINED3DSIH_IF
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_IFC
,
0
,
2
,
WINED3DSIH_IFC
,
WINED3DVS_VERSION
(
2
,
1
),
-
1
},
{
WINED3DSIO_ELSE
,
0
,
0
,
WINED3DSIH_ELSE
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_ENDIF
,
0
,
0
,
WINED3DSIH_ENDIF
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_BREAK
,
0
,
0
,
WINED3DSIH_BREAK
,
WINED3DVS_VERSION
(
2
,
1
),
-
1
},
{
WINED3DSIO_BREAKC
,
0
,
2
,
WINED3DSIH_BREAKC
,
WINED3DVS_VERSION
(
2
,
1
),
-
1
},
{
WINED3DSIO_BREAKP
,
0
,
1
,
WINED3DSIH_BREAKP
,
0
,
0
},
{
WINED3DSIO_CALL
,
0
,
1
,
WINED3DSIH_CALL
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_CALLNZ
,
0
,
2
,
WINED3DSIH_CALLNZ
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_LOOP
,
0
,
2
,
WINED3DSIH_LOOP
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_RET
,
0
,
0
,
WINED3DSIH_RET
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_ENDLOOP
,
0
,
0
,
WINED3DSIH_ENDLOOP
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_LABEL
,
0
,
1
,
WINED3DSIH_LABEL
,
WINED3DVS_VERSION
(
2
,
0
),
-
1
},
{
WINED3DSIO_SETP
,
1
,
3
,
WINED3DSIH_SETP
,
0
,
0
},
{
WINED3DSIO_TEXLDL
,
1
,
3
,
WINED3DSIH_TEXLDL
,
WINED3DVS_VERSION
(
3
,
0
),
-
1
},
{
0
,
0
,
0
,
WINED3DSIH_TABLE_SIZE
,
0
,
0
},
};
static
void
vshader_set_limits
(
IWineD3DVertexShaderImpl
*
This
)
{
...
...
@@ -325,9 +257,16 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
FIXME
(
"Unable to find frontend for shader.
\n
"
);
return
WINED3DERR_INVALIDCALL
;
}
This
->
baseShader
.
frontend
=
fe
;
This
->
baseShader
.
frontend_data
=
fe
->
shader_init
(
pFunction
);
if
(
!
This
->
baseShader
.
frontend_data
)
{
FIXME
(
"Failed to initialize frontend.
\n
"
);
return
WINED3DERR_INVALIDCALL
;
}
/* First pass: trace shader */
if
(
TRACE_ON
(
d3d_shader
))
shader_trace_init
(
fe
,
pFunction
,
This
->
baseShader
.
shader_ins
);
if
(
TRACE_ON
(
d3d_shader
))
shader_trace_init
(
fe
,
This
->
baseShader
.
frontend_data
,
pFunction
);
/* Initialize immediate constant lists */
list_init
(
&
This
->
baseShader
.
constantsF
);
...
...
@@ -412,22 +351,14 @@ static HRESULT WINAPI IWIneD3DVertexShaderImpl_SetLocalConstantsF(IWineD3DVertex
static
GLuint
vertexshader_compile
(
IWineD3DVertexShaderImpl
*
This
,
const
struct
vs_compile_args
*
args
)
{
IWineD3DDeviceImpl
*
deviceImpl
=
(
IWineD3DDeviceImpl
*
)
This
->
baseShader
.
device
;
const
struct
wined3d_shader_frontend
*
fe
;
SHADER_BUFFER
buffer
;
GLuint
ret
;
fe
=
shader_select_frontend
(
This
->
baseShader
.
reg_maps
.
shader_version
);
if
(
!
fe
)
{
FIXME
(
"Unable to find frontend for shader.
\n
"
);
return
WINED3DERR_INVALIDCALL
;
}
/* Generate the HW shader */
TRACE
(
"(%p) : Generating hardware program
\n
"
,
This
);
shader_buffer_init
(
&
buffer
);
This
->
cur_args
=
args
;
ret
=
deviceImpl
->
shader_backend
->
shader_generate_vshader
((
IWineD3DVertexShader
*
)
This
,
fe
,
&
buffer
,
args
);
ret
=
deviceImpl
->
shader_backend
->
shader_generate_vshader
((
IWineD3DVertexShader
*
)
This
,
&
buffer
,
args
);
This
->
cur_args
=
NULL
;
shader_buffer_free
(
&
buffer
);
...
...
dlls/wined3d/wined3d_private.h
View file @
2a5a6a34
...
...
@@ -470,9 +470,15 @@ typedef enum COMPARISON_TYPE
COMPARISON_LE
=
6
,
}
COMPARISON_TYPE
;
#define WINED3D_SM1_VS 0xfffe
#define WINED3D_SM1_PS 0xffff
#define WINED3D_SM4_PS 0x0000
#define WINED3D_SM4_VS 0x0001
#define WINED3D_SM4_GS 0x0002
/* Shader version tokens, and shader end tokens */
#define WINED3DPS_VERSION(major, minor) (
0xffff0000
| ((major) << 8) | (minor))
#define WINED3DVS_VERSION(major, minor) (
0xfffe0000
| ((major) << 8) | (minor))
#define WINED3DPS_VERSION(major, minor) (
(WINED3D_SM1_PS << 16)
| ((major) << 8) | (minor))
#define WINED3DVS_VERSION(major, minor) (
(WINED3D_SM1_VS << 16)
| ((major) << 8) | (minor))
#define WINED3DSHADER_VERSION_MAJOR(version) (((version) >> 8) & 0xff)
#define WINED3DSHADER_VERSION_MINOR(version) (((version) >> 0) & 0xff)
...
...
@@ -615,16 +621,6 @@ typedef struct shader_reg_maps
}
shader_reg_maps
;
typedef
struct
SHADER_OPCODE
{
unsigned
int
opcode
;
char
dst_token
;
CONST
UINT
num_params
;
enum
WINED3D_SHADER_INSTRUCTION_HANDLER
handler_idx
;
DWORD
min_version
;
DWORD
max_version
;
}
SHADER_OPCODE
;
struct
wined3d_shader_context
{
IWineD3DBaseShader
*
shader
;
...
...
@@ -674,9 +670,11 @@ struct wined3d_shader_semantic
struct
wined3d_shader_frontend
{
void
*
(
*
shader_init
)(
const
DWORD
*
ptr
);
void
(
*
shader_free
)(
void
*
data
);
void
(
*
shader_read_header
)(
const
DWORD
**
ptr
,
DWORD
*
shader_version
);
void
(
*
shader_read_opcode
)(
const
DWORD
**
ptr
,
struct
wined3d_shader_instruction
*
ins
,
UINT
*
param_size
,
const
SHADER_OPCODE
*
opcode_table
,
DWORD
shader_version
);
void
(
*
shader_read_opcode
)(
void
*
data
,
const
DWORD
**
ptr
,
struct
wined3d_shader_instruction
*
ins
,
UINT
*
param_size
,
DWORD
shader_version
);
void
(
*
shader_read_src_param
)(
const
DWORD
**
ptr
,
struct
wined3d_shader_src_param
*
src_param
,
struct
wined3d_shader_src_param
*
src_rel_addr
,
DWORD
shader_version
);
void
(
*
shader_read_dst_param
)(
const
DWORD
**
ptr
,
struct
wined3d_shader_dst_param
*
dst_param
,
...
...
@@ -777,9 +775,9 @@ typedef struct {
HRESULT
(
*
shader_alloc_private
)(
IWineD3DDevice
*
iface
);
void
(
*
shader_free_private
)(
IWineD3DDevice
*
iface
);
BOOL
(
*
shader_dirtifyable_constants
)(
IWineD3DDevice
*
iface
);
GLuint
(
*
shader_generate_pshader
)(
IWineD3DPixelShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
GLuint
(
*
shader_generate_pshader
)(
IWineD3DPixelShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
ps_compile_args
*
args
);
GLuint
(
*
shader_generate_vshader
)(
IWineD3DVertexShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
GLuint
(
*
shader_generate_vshader
)(
IWineD3DVertexShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
vs_compile_args
*
args
);
void
(
*
shader_get_caps
)(
WINED3DDEVTYPE
devtype
,
const
WineD3D_GL_Info
*
gl_info
,
struct
shader_caps
*
caps
);
BOOL
(
*
shader_color_fixup_supported
)(
struct
color_fixup_desc
fixup
);
...
...
@@ -2512,11 +2510,12 @@ typedef struct IWineD3DBaseShaderClass
LONG
ref
;
SHADER_LIMITS
limits
;
SHADER_PARSE_STATE
parse_state
;
CONST
SHADER_OPCODE
*
shader_ins
;
DWORD
*
function
;
UINT
functionLength
;
UINT
cur_loop_depth
,
cur_loop_regno
;
BOOL
load_local_constsF
;
const
struct
wined3d_shader_frontend
*
frontend
;
void
*
frontend_data
;
/* Type of shader backend */
int
shader_mode
;
...
...
@@ -2550,16 +2549,13 @@ void shader_cleanup(IWineD3DBaseShader *iface);
void
shader_dump_src_param
(
const
struct
wined3d_shader_src_param
*
param
,
DWORD
shader_version
);
void
shader_dump_dst_param
(
const
struct
wined3d_shader_dst_param
*
param
,
DWORD
shader_version
);
void
shader_generate_main
(
IWineD3DBaseShader
*
iface
,
SHADER_BUFFER
*
buffer
,
const
struct
wined3d_shader_frontend
*
fe
,
const
shader_reg_maps
*
reg_maps
,
const
DWORD
*
pFunction
);
const
shader_reg_maps
*
reg_maps
,
const
DWORD
*
pFunction
);
HRESULT
shader_get_registers_used
(
IWineD3DBaseShader
*
iface
,
const
struct
wined3d_shader_frontend
*
fe
,
struct
shader_reg_maps
*
reg_maps
,
struct
wined3d_shader_semantic
*
semantics_in
,
struct
wined3d_shader_semantic
*
semantics_out
,
const
DWORD
*
byte_code
);
void
shader_init
(
struct
IWineD3DBaseShaderClass
*
shader
,
IWineD3DDevice
*
device
,
const
SHADER_OPCODE
*
instruction_table
);
void
shader_init
(
struct
IWineD3DBaseShaderClass
*
shader
,
IWineD3DDevice
*
device
);
const
struct
wined3d_shader_frontend
*
shader_select_frontend
(
DWORD
version_token
);
void
shader_trace_init
(
const
struct
wined3d_shader_frontend
*
fe
,
const
DWORD
*
pFunction
,
const
SHADER_OPCODE
*
opcode_table
);
void
shader_trace_init
(
const
struct
wined3d_shader_frontend
*
fe
,
void
*
fe_data
,
const
DWORD
*
pFunction
);
static
inline
BOOL
shader_is_pshader_version
(
DWORD
token
)
{
return
0xFFFF0000
==
(
token
&
0xFFFF0000
);
...
...
@@ -2648,7 +2644,6 @@ typedef struct IWineD3DVertexShaderImpl {
const
struct
vs_compile_args
*
cur_args
;
}
IWineD3DVertexShaderImpl
;
extern
const
SHADER_OPCODE
IWineD3DVertexShaderImpl_shader_ins
[];
extern
const
IWineD3DVertexShaderVtbl
IWineD3DVertexShader_Vtbl
;
void
find_vs_compile_args
(
IWineD3DVertexShaderImpl
*
shader
,
IWineD3DStateBlockImpl
*
stateblock
,
struct
vs_compile_args
*
args
);
...
...
@@ -2691,7 +2686,6 @@ typedef struct IWineD3DPixelShaderImpl {
const
struct
ps_compile_args
*
cur_args
;
}
IWineD3DPixelShaderImpl
;
extern
const
SHADER_OPCODE
IWineD3DPixelShaderImpl_shader_ins
[];
extern
const
IWineD3DPixelShaderVtbl
IWineD3DPixelShader_Vtbl
;
GLuint
find_gl_pshader
(
IWineD3DPixelShaderImpl
*
shader
,
const
struct
ps_compile_args
*
args
);
void
find_ps_compile_args
(
IWineD3DPixelShaderImpl
*
shader
,
IWineD3DStateBlockImpl
*
stateblock
,
struct
ps_compile_args
*
args
);
...
...
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