Hi guys,
while trying to compile wine with clang, I get a whole bunch of
"implicit conversion from enumeration type FOO to different
enumeration type WINED3DFOO" (and conversely) warnings when an enum
value of type A is assigned to a var of enum type B.
In order to tackle those, instead of using (probably ugly) casts
everywhere, I put them in a "static inline" function in d3dX_private.h
(conv functions put in the header so inlining is possible everywhere,
so a potential performance impact is limited)
Originally, I intended to issue a FIXME("Unhandled/unrecognized
value...") in the default: clause of a switch statement to catch
values not in in the original enum's domain, but I couldn't find a way
to make FIXMEs work in a .h file 'cos of a macro expansion hell
I'm not quite sure however what the best solution is wrt performance,
so I'd like your comments on this
Some explanations:
*D3DPOOL and WINED3DPOOL have a full 1-1 mapping, so the conv
functions simply do a cast.
*D3DRESOURCETYPE and WINED3DRESOURCETYPE have *not* a 1-1 mapping, and
I present here 3 possible solution types:
D3DRESOURCETYPE =>
D3DRTYPE_SURFACE = 1,
D3DRTYPE_VOLUME = 2,
D3DRTYPE_TEXTURE = 3,
D3DRTYPE_VOLUMETEXTURE = 4,
D3DRTYPE_CUBETEXTURE = 5,
D3DRTYPE_VERTEXBUFFER = 6,
D3DRTYPE_INDEXBUFFER = 7,
D3DRTYPE_FORCE_DWORD = 0x7fffffff
WINED3DRESOURCETYPE =>
WINED3DRTYPE_SURFACE = 1,
WINED3DRTYPE_VOLUME = 2,
WINED3DRTYPE_TEXTURE = 3,
WINED3DRTYPE_VOLUMETEXTURE = 4,
WINED3DRTYPE_CUBETEXTURE = 5,
WINED3DRTYPE_BUFFER = 6,
WINED3DRTYPE_FORCE_DWORD = 0x7fffffff
Type 1
---------
Identical semantics to direct assigment
All cases specified, even "obvious" ones (D3D_FOO <-> WINED3D_FOO),
using same enum value; non mapped values use the default: clause (e.g.
D3DRTYPE_INDEXBUFFER=7; no 7 enum val in WINED3DRESOURCETYPE)
Default clause: only used for values not in original enum
Type 2
---------
Same as v1 except obvious values aren't specified in a case:
Non directly obvious values (same enum val) can still be "highlighted"
(e.g. WINED3DRTYPE_BUFFER=6 ==> D3DRTYPE_VERTEXBUFFER=6)
Default clause: used for values not in original enum AND obvious values
Maybe more optimal than "type 1", but isn't that a micro/premature
optimisation?
Type 3
---------
Potentially more risky/invasive: conversion does not simply return value "as-is"
Semantics *changes* from direct assigment; some additional code
changes are necessary; could help centralise, though
e.g.
D3DRTYPE_VERTEXBUFFER=6 => WINED3DRTYPE_BUFFER=6
D3DRTYPE_INDEXBUFFER=7 => WINED3DRTYPE_BUFFER=6
Adapted code (directx.c):
- switch(RType) {
- case D3DRTYPE_VERTEXBUFFER:
- case D3DRTYPE_INDEXBUFFER:
- WineD3DRType = WINED3DRTYPE_BUFFER;
- break;
-
- default:
- WineD3DRType = RType;
- break;
- }
+ WineD3DRType = wined3dresourcetype_from_d3dresourcetype(RType);
What do you think would be best?
Frédéric