//============================================================ // // drawd3di.h - Direct3D 8/9 interface abstractions // // Copyright (c) 1996-2007, Nicola Salmoria and the MAME Team. // Visit http://mamedev.org for licensing and usage restrictions. // //============================================================ #ifndef __WIN_DRAWD3DI__ #define __WIN_DRAWD3DI__ //============================================================ // CONSTANTS //============================================================ #ifndef D3DCAPS2_DYNAMICTEXTURES #define D3DCAPS2_DYNAMICTEXTURES 0x20000000L #endif #ifndef D3DPRESENT_DONOTWAIT #define D3DPRESENT_DONOTWAIT 0x00000001L #endif #if (DIRECT3D_VERSION >= 0x0900) // the following used to be TEXTURESTAGESTATES but are now SAMPLERSTATES enum { D3DTSS_ADDRESSU = 13, D3DTSS_ADDRESSV = 14, D3DTSS_BORDERCOLOR = 15, D3DTSS_MAGFILTER = 16, D3DTSS_MINFILTER = 17, D3DTSS_MIPFILTER = 18, D3DTSS_MIPMAPLODBIAS = 19, D3DTSS_MAXMIPLEVEL = 20, D3DTSS_MAXANISOTROPY = 21 }; #endif //============================================================ // TYPE DEFINITIONS //============================================================ typedef struct _d3d d3d; typedef struct _d3d_device d3d_device; typedef struct _d3d_surface d3d_surface; typedef struct _d3d_texture d3d_texture; typedef struct _d3d_vertex_buffer d3d_vertex_buffer; //============================================================ // Abstracted presentation parameters //============================================================ typedef struct _d3d_present_parameters d3d_present_parameters; struct _d3d_present_parameters { UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT PresentationInterval; }; //============================================================ // Abstracted device identifier //============================================================ typedef struct _d3d_adapter_identifier d3d_adapter_identifier; struct _d3d_adapter_identifier { char Driver[512]; char Description[512]; LARGE_INTEGER DriverVersion; DWORD VendorId; DWORD DeviceId; DWORD SubSysId; DWORD Revision; GUID DeviceIdentifier; DWORD WHQLLevel; }; //============================================================ // Caps enumeration //============================================================ enum _d3d_caps_index { CAPS_PRESENTATION_INTERVALS, CAPS_CAPS2, CAPS_DEV_CAPS, CAPS_SRCBLEND_CAPS, CAPS_DSTBLEND_CAPS, CAPS_TEXTURE_CAPS, CAPS_TEXTURE_FILTER_CAPS, CAPS_TEXTURE_ADDRESS_CAPS, CAPS_TEXTURE_OP_CAPS, CAPS_MAX_TEXTURE_ASPECT, CAPS_MAX_TEXTURE_WIDTH, CAPS_MAX_TEXTURE_HEIGHT, CAPS_STRETCH_RECT_FILTER }; typedef enum _d3d_caps_index d3d_caps_index; //============================================================ // Direct3D interfaces //============================================================ typedef struct _d3d_interface d3d_interface; struct _d3d_interface { HRESULT (*check_device_format)(d3d *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format); HRESULT (*check_device_type)(d3d *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed); HRESULT (*create_device)(d3d *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, d3d_present_parameters *params, d3d_device **dev); HRESULT (*enum_adapter_modes)(d3d *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode); UINT (*get_adapter_count)(d3d *d3dptr); HRESULT (*get_adapter_display_mode)(d3d *d3dptr, UINT adapter, D3DDISPLAYMODE *mode); HRESULT (*get_adapter_identifier)(d3d *d3dptr, UINT adapter, DWORD flags, d3d_adapter_identifier *identifier); UINT (*get_adapter_mode_count)(d3d *d3dptr, UINT adapter, D3DFORMAT format); HMONITOR (*get_adapter_monitor)(d3d *d3dptr, UINT adapter); HRESULT (*get_caps_dword)(d3d *d3dptr, UINT adapter, D3DDEVTYPE devtype, d3d_caps_index which, DWORD *value); ULONG (*release)(d3d *d3dptr); }; //============================================================ // Direct3DDevice interfaces //============================================================ typedef struct _d3d_device_interface d3d_device_interface; struct _d3d_device_interface { HRESULT (*begin_scene)(d3d_device *dev); HRESULT (*clear)(d3d_device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil); HRESULT (*create_offscreen_plain_surface)(d3d_device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, d3d_surface **surface); HRESULT (*create_texture)(d3d_device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, d3d_texture **texture); HRESULT (*create_vertex_buffer)(d3d_device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, d3d_vertex_buffer **buf); HRESULT (*draw_primitive)(d3d_device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count); HRESULT (*end_scene)(d3d_device *dev); HRESULT (*get_raster_status)(d3d_device *dev, D3DRASTER_STATUS *status); HRESULT (*get_render_target)(d3d_device *dev, DWORD index, d3d_surface **surface); HRESULT (*present)(d3d_device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags); ULONG (*release)(d3d_device *dev); HRESULT (*reset)(d3d_device *dev, d3d_present_parameters *params); void (*set_gamma_ramp)(d3d_device *dev, DWORD flags, const D3DGAMMARAMP *ramp); HRESULT (*set_render_state)(d3d_device *dev, D3DRENDERSTATETYPE state, DWORD value); HRESULT (*set_render_target)(d3d_device *dev, DWORD index, d3d_surface *surf); HRESULT (*set_stream_source)(d3d_device *dev, UINT number, d3d_vertex_buffer *vbuf, UINT stride); HRESULT (*set_texture)(d3d_device *dev, DWORD stage, d3d_texture *tex); HRESULT (*set_texture_stage_state)(d3d_device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value); HRESULT (*set_vertex_shader)(d3d_device *dev, D3DFORMAT format); HRESULT (*stretch_rect)(d3d_device *dev, d3d_surface *source, const RECT *srcrect, d3d_surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter); HRESULT (*test_cooperative_level)(d3d_device *dev); }; //============================================================ // Direct3DSurface interfaces //============================================================ typedef struct _d3d_surface_interface d3d_surface_interface; struct _d3d_surface_interface { HRESULT (*lock_rect)(d3d_surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags); ULONG (*release)(d3d_surface *tex); HRESULT (*unlock_rect)(d3d_surface *surf); }; //============================================================ // Direct3DTexture interfaces //============================================================ typedef struct _d3d_texture_interface d3d_texture_interface; struct _d3d_texture_interface { HRESULT (*get_surface_level)(d3d_texture *tex, UINT level, d3d_surface **surface); HRESULT (*lock_rect)(d3d_texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags); ULONG (*release)(d3d_texture *tex); HRESULT (*unlock_rect)(d3d_texture *tex, UINT level); }; //============================================================ // Direct3DVertexBuffer interfaces //============================================================ typedef struct _d3d_vertex_buffer_interface d3d_vertex_buffer_interface; struct _d3d_vertex_buffer_interface { HRESULT (*lock)(d3d_vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags); ULONG (*release)(d3d_vertex_buffer *vbuf); HRESULT (*unlock)(d3d_vertex_buffer *vbuf); }; //============================================================ // Core D3D object //============================================================ struct _d3d { // internal objects int version; void * d3dobj; HINSTANCE dllhandle; // interface pointers d3d_interface d3d; d3d_device_interface device; d3d_surface_interface surface; d3d_texture_interface texture; d3d_vertex_buffer_interface vertexbuf; }; //============================================================ // PROTOTYPES //============================================================ d3d *drawd3d8_init(void); d3d *drawd3d9_init(void); #endif