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
13098449
Commit
13098449
authored
Jul 04, 2006
by
Ivan Gyurdiev
Committed by
Alexandre Julliard
Jul 06, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Implement FVF to DECL9 conversion (with tests).
parent
276609e1
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
185 additions
and
14 deletions
+185
-14
d3d9_private.h
dlls/d3d9/d3d9_private.h
+7
-0
device.c
dlls/d3d9/device.c
+22
-0
vertexdeclaration.c
dlls/d3d9/tests/vertexdeclaration.c
+0
-0
vertexdeclaration.c
dlls/d3d9/vertexdeclaration.c
+156
-0
device.c
dlls/wined3d/device.c
+0
-14
No files found.
dlls/d3d9/d3d9_private.h
View file @
13098449
...
@@ -40,6 +40,13 @@
...
@@ -40,6 +40,13 @@
#include "wine/wined3d_interface.h"
#include "wine/wined3d_interface.h"
/* ===========================================================================
/* ===========================================================================
Internal use
=========================================================================== */
extern
HRESULT
vdecl_convert_fvf
(
DWORD
FVF
,
D3DVERTEXELEMENT9
**
ppVertexElements
);
/* ===========================================================================
Macros
Macros
=========================================================================== */
=========================================================================== */
/* Not nice, but it lets wined3d support different versions of directx */
/* Not nice, but it lets wined3d support different versions of directx */
...
...
dlls/d3d9/device.c
View file @
13098449
...
@@ -713,6 +713,28 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices(LPDIRECT3DDEVICE9 i
...
@@ -713,6 +713,28 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ProcessVertices(LPDIRECT3DDEVICE9 i
HRESULT
WINAPI
IDirect3DDevice9Impl_SetFVF
(
LPDIRECT3DDEVICE9
iface
,
DWORD
FVF
)
{
HRESULT
WINAPI
IDirect3DDevice9Impl_SetFVF
(
LPDIRECT3DDEVICE9
iface
,
DWORD
FVF
)
{
IDirect3DDevice9Impl
*
This
=
(
IDirect3DDevice9Impl
*
)
iface
;
IDirect3DDevice9Impl
*
This
=
(
IDirect3DDevice9Impl
*
)
iface
;
TRACE
(
"(%p) Relay
\n
"
,
This
);
TRACE
(
"(%p) Relay
\n
"
,
This
);
if
(
0
!=
FVF
)
{
HRESULT
hr
;
D3DVERTEXELEMENT9
*
elements
=
NULL
;
IDirect3DVertexDeclaration9
*
pDecl
=
NULL
;
hr
=
vdecl_convert_fvf
(
FVF
,
&
elements
);
if
(
hr
!=
S_OK
)
goto
exit
;
hr
=
IDirect3DDevice9Impl_CreateVertexDeclaration
(
iface
,
elements
,
&
pDecl
);
if
(
hr
!=
S_OK
)
goto
exit
;
hr
=
IDirect3DDevice9Impl_SetVertexDeclaration
(
iface
,
pDecl
);
if
(
hr
!=
S_OK
)
goto
exit
;
pDecl
=
NULL
;
exit:
HeapFree
(
GetProcessHeap
(),
0
,
elements
);
if
(
pDecl
)
IUnknown_Release
(
pDecl
);
if
(
hr
!=
S_OK
)
return
hr
;
}
return
IWineD3DDevice_SetFVF
(
This
->
WineD3DDevice
,
FVF
);
return
IWineD3DDevice_SetFVF
(
This
->
WineD3DDevice
,
FVF
);
}
}
...
...
dlls/d3d9/tests/vertexdeclaration.c
View file @
13098449
This diff is collapsed.
Click to expand it.
dlls/d3d9/vertexdeclaration.c
View file @
13098449
...
@@ -24,6 +24,162 @@
...
@@ -24,6 +24,162 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
d3d9
);
WINE_DEFAULT_DEBUG_CHANNEL
(
d3d9
);
typedef
struct
_D3DDECLTYPE_INFO
{
D3DDECLTYPE
d3dType
;
int
size
;
int
typesize
;
}
D3DDECLTYPE_INFO
;
D3DDECLTYPE_INFO
static
const
d3d_dtype_lookup
[
D3DDECLTYPE_UNUSED
]
=
{
{
D3DDECLTYPE_FLOAT1
,
1
,
sizeof
(
float
)},
{
D3DDECLTYPE_FLOAT2
,
2
,
sizeof
(
float
)},
{
D3DDECLTYPE_FLOAT3
,
3
,
sizeof
(
float
)},
{
D3DDECLTYPE_FLOAT4
,
4
,
sizeof
(
float
)},
{
D3DDECLTYPE_D3DCOLOR
,
4
,
sizeof
(
BYTE
)},
{
D3DDECLTYPE_UBYTE4
,
4
,
sizeof
(
BYTE
)},
{
D3DDECLTYPE_SHORT2
,
2
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_SHORT4
,
4
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_UBYTE4N
,
4
,
sizeof
(
BYTE
)},
{
D3DDECLTYPE_SHORT2N
,
2
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_SHORT4N
,
4
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_USHORT2N
,
2
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_USHORT4N
,
4
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_UDEC3
,
3
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_DEC3N
,
3
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_FLOAT16_2
,
2
,
sizeof
(
short
int
)},
{
D3DDECLTYPE_FLOAT16_4
,
4
,
sizeof
(
short
int
)}};
#define D3D_DECL_SIZE(type) d3d_dtype_lookup[type].size
#define D3D_DECL_TYPESIZE(type) d3d_dtype_lookup[type].typesize
HRESULT
vdecl_convert_fvf
(
DWORD
fvf
,
D3DVERTEXELEMENT9
**
ppVertexElements
)
{
unsigned
int
idx
,
idx2
;
unsigned
int
offset
;
BOOL
has_pos
=
(
fvf
&
D3DFVF_POSITION_MASK
)
!=
0
;
BOOL
has_blend
=
(
fvf
&
D3DFVF_XYZB5
)
>
D3DFVF_XYZRHW
;
BOOL
has_blend_idx
=
has_blend
&&
(((
fvf
&
D3DFVF_XYZB5
)
==
D3DFVF_XYZB5
)
||
(
fvf
&
D3DFVF_LASTBETA_D3DCOLOR
)
||
(
fvf
&
D3DFVF_LASTBETA_UBYTE4
));
BOOL
has_normal
=
(
fvf
&
D3DFVF_NORMAL
)
!=
0
;
BOOL
has_psize
=
(
fvf
&
D3DFVF_PSIZE
)
!=
0
;
BOOL
has_diffuse
=
(
fvf
&
D3DFVF_DIFFUSE
)
!=
0
;
BOOL
has_specular
=
(
fvf
&
D3DFVF_SPECULAR
)
!=
0
;
DWORD
num_textures
=
(
fvf
&
D3DFVF_TEXCOUNT_MASK
)
>>
D3DFVF_TEXCOUNT_SHIFT
;
DWORD
texcoords
=
(
fvf
&
0x00FF0000
)
>>
16
;
D3DVERTEXELEMENT9
end_element
=
D3DDECL_END
();
D3DVERTEXELEMENT9
*
elements
=
NULL
;
unsigned
int
size
;
DWORD
num_blends
=
1
+
(((
fvf
&
D3DFVF_XYZB5
)
-
D3DFVF_XYZB1
)
>>
1
);
if
(
has_blend_idx
)
num_blends
--
;
/* Compute declaration size */
size
=
has_pos
+
(
has_blend
&&
num_blends
>
0
)
+
has_blend_idx
+
has_normal
+
has_psize
+
has_diffuse
+
has_specular
+
num_textures
+
1
;
/* convert the declaration */
elements
=
HeapAlloc
(
GetProcessHeap
(),
0
,
size
*
sizeof
(
D3DVERTEXELEMENT9
));
if
(
!
elements
)
return
D3DERR_OUTOFVIDEOMEMORY
;
memcpy
(
&
elements
[
size
-
1
],
&
end_element
,
sizeof
(
D3DVERTEXELEMENT9
));
idx
=
0
;
if
(
has_pos
)
{
if
(
!
has_blend
&&
(
fvf
&
D3DFVF_XYZRHW
))
{
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT4
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_POSITIONT
;
}
else
{
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT3
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_POSITION
;
}
elements
[
idx
].
UsageIndex
=
0
;
idx
++
;
}
if
(
has_blend
&&
(
num_blends
>
0
))
{
if
(((
fvf
&
D3DFVF_XYZB5
)
==
D3DFVF_XYZB2
)
&&
(
fvf
&
D3DFVF_LASTBETA_D3DCOLOR
))
elements
[
idx
].
Type
=
D3DDECLTYPE_D3DCOLOR
;
else
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT1
+
num_blends
-
1
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_BLENDWEIGHT
;
elements
[
idx
].
UsageIndex
=
0
;
idx
++
;
}
if
(
has_blend_idx
)
{
if
(
fvf
&
D3DFVF_LASTBETA_UBYTE4
||
(((
fvf
&
D3DFVF_XYZB5
)
==
D3DFVF_XYZB2
)
&&
(
fvf
&
D3DFVF_LASTBETA_D3DCOLOR
)))
elements
[
idx
].
Type
=
D3DDECLTYPE_UBYTE4
;
else
if
(
fvf
&
D3DFVF_LASTBETA_D3DCOLOR
)
elements
[
idx
].
Type
=
D3DDECLTYPE_D3DCOLOR
;
else
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT1
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_BLENDINDICES
;
elements
[
idx
].
UsageIndex
=
0
;
idx
++
;
}
if
(
has_normal
)
{
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT3
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_NORMAL
;
elements
[
idx
].
UsageIndex
=
0
;
idx
++
;
}
if
(
has_psize
)
{
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT1
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_PSIZE
;
elements
[
idx
].
UsageIndex
=
0
;
idx
++
;
}
if
(
has_diffuse
)
{
elements
[
idx
].
Type
=
D3DDECLTYPE_D3DCOLOR
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_COLOR
;
elements
[
idx
].
UsageIndex
=
0
;
idx
++
;
}
if
(
has_specular
)
{
elements
[
idx
].
Type
=
D3DDECLTYPE_D3DCOLOR
;
elements
[
idx
].
Usage
=
D3DDECLUSAGE_COLOR
;
elements
[
idx
].
UsageIndex
=
1
;
idx
++
;
}
for
(
idx2
=
0
;
idx2
<
num_textures
;
idx2
++
)
{
unsigned
int
numcoords
=
(
texcoords
>>
(
idx2
*
2
))
&
0x03
;
switch
(
numcoords
)
{
case
D3DFVF_TEXTUREFORMAT1
:
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT1
;
break
;
case
D3DFVF_TEXTUREFORMAT2
:
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT2
;
break
;
case
D3DFVF_TEXTUREFORMAT3
:
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT3
;
break
;
case
D3DFVF_TEXTUREFORMAT4
:
elements
[
idx
].
Type
=
D3DDECLTYPE_FLOAT4
;
break
;
}
elements
[
idx
].
Usage
=
D3DDECLUSAGE_TEXCOORD
;
elements
[
idx
].
UsageIndex
=
idx2
;
idx
++
;
}
/* Now compute offsets, and initialize the rest of the fields */
for
(
idx
=
0
,
offset
=
0
;
idx
<
size
-
1
;
idx
++
)
{
elements
[
idx
].
Stream
=
0
;
elements
[
idx
].
Method
=
D3DDECLMETHOD_DEFAULT
;
elements
[
idx
].
Offset
=
offset
;
offset
+=
D3D_DECL_SIZE
(
elements
[
idx
].
Type
)
*
D3D_DECL_TYPESIZE
(
elements
[
idx
].
Type
);
}
*
ppVertexElements
=
elements
;
return
D3D_OK
;
}
/* IDirect3DVertexDeclaration9 IUnknown parts follow: */
/* IDirect3DVertexDeclaration9 IUnknown parts follow: */
static
HRESULT
WINAPI
IDirect3DVertexDeclaration9Impl_QueryInterface
(
LPDIRECT3DVERTEXDECLARATION9
iface
,
REFIID
riid
,
LPVOID
*
ppobj
)
{
static
HRESULT
WINAPI
IDirect3DVertexDeclaration9Impl_QueryInterface
(
LPDIRECT3DVERTEXDECLARATION9
iface
,
REFIID
riid
,
LPVOID
*
ppobj
)
{
IDirect3DVertexDeclaration9Impl
*
This
=
(
IDirect3DVertexDeclaration9Impl
*
)
iface
;
IDirect3DVertexDeclaration9Impl
*
This
=
(
IDirect3DVertexDeclaration9Impl
*
)
iface
;
...
...
dlls/wined3d/device.c
View file @
13098449
...
@@ -2355,15 +2355,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFVF(IWineD3DDevice *iface, DWORD fvf
...
@@ -2355,15 +2355,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFVF(IWineD3DDevice *iface, DWORD fvf
This
->
updateStateBlock
->
set
.
fvf
=
TRUE
;
This
->
updateStateBlock
->
set
.
fvf
=
TRUE
;
TRACE
(
"(%p) : FVF Shader FVF set to %lx
\n
"
,
This
,
fvf
);
TRACE
(
"(%p) : FVF Shader FVF set to %lx
\n
"
,
This
,
fvf
);
if
(
0
!=
fvf
)
{
/* clear down the vertex declaration
NOTE: Axis and Allies doesn't work properly otherwise
(may be a stateblock problem though!)
*/
hr
=
IWineD3DDevice_SetVertexDeclaration
(
iface
,
NULL
);
}
return
hr
;
return
hr
;
}
}
...
@@ -4641,11 +4632,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface,
...
@@ -4641,11 +4632,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetVertexShader(IWineD3DDevice *iface,
IWineD3DVertexShader_Release
(
oldShader
);
IWineD3DVertexShader_Release
(
oldShader
);
}
}
if
(
pShader
!=
NULL
&&
((
IWineD3DVertexShaderImpl
*
)
pShader
)
->
vertexDeclaration
!=
NULL
)
{
TRACE
(
"(%p) : setting vertexDeclaration(%p)
\n
"
,
This
,
((
IWineD3DVertexShaderImpl
*
)
pShader
)
->
vertexDeclaration
);
IWineD3DDevice_SetVertexDeclaration
(
iface
,
((
IWineD3DVertexShaderImpl
*
)
pShader
)
->
vertexDeclaration
);
}
TRACE
(
"(%p) : setting pShader(%p)
\n
"
,
This
,
pShader
);
TRACE
(
"(%p) : setting pShader(%p)
\n
"
,
This
,
pShader
);
/**
/**
* TODO: merge HAL shaders context switching from prototype
* TODO: merge HAL shaders context switching from prototype
...
...
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