summaryrefslogtreecommitdiffstats
path: root/src/osd/windows/drawd3d.h
blob: 7cca9fee0990fe3bfdf27be39a4b23342b7ca174 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
//============================================================
//
//  drawd3d.h - Win32 Direct3D header
//
//============================================================
//
//  Copyright Aaron Giles
//  All rights reserved.
//
//  Redistribution and use in source and binary forms, with or
//  without modification, are permitted provided that the
//  following conditions are met:
//
//    * Redistributions of source code must retain the above
//      copyright notice, this list of conditions and the
//      following disclaimer.
//    * Redistributions in binary form must reproduce the
//      above copyright notice, this list of conditions and
//      the following disclaimer in the documentation and/or
//      other materials provided with the distribution.
//    * Neither the name 'MAME' nor the names of its
//      contributors may be used to endorse or promote
//      products derived from this software without specific
//      prior written permission.
//
//  THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND
//  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
//  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
//  EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
//  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
//  DAMAGE (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
//  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
//  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
//  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
//  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
//  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//============================================================

#ifndef __WIN_DRAWD3D__
#define __WIN_DRAWD3D__


#include "d3dhlsl.h"


//============================================================
//  CONSTANTS
//============================================================

#define VERTEX_BASE_FORMAT  (D3DFVF_DIFFUSE | D3DFVF_TEX1)
#define VERTEX_BUFFER_SIZE  (2048*4+4)

//============================================================
//  TYPE DEFINITIONS
//============================================================

struct d3d_info;

/* d3d_cache_target is a simple linked list containing only a rednerable target and texture, used for phosphor effects */
class d3d_cache_target
{
public:
	// construction/destruction
	d3d_cache_target() { }
	~d3d_cache_target();

	bool init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y, bool bloom);

	d3d_surface *last_target;
	d3d_texture *last_texture;

    int target_width;
    int target_height;

	int width;
	int height;

	int screen_index;

	d3d_cache_target *next;
	d3d_cache_target *prev;

    d3d_surface *bloom_target[11];
    d3d_texture *bloom_texture[11];
};

/* d3d_render_target is the information about a Direct3D render target chain */
class d3d_render_target
{
public:
	// construction/destruction
	d3d_render_target() { }
	~d3d_render_target();

	bool init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y, bool bloom = false);

	int target_width;
	int target_height;

	int width;
	int height;

	int screen_index;
	int page_index;

	d3d_surface *prescaletarget;
	d3d_texture *prescaletexture;
	d3d_surface *smalltarget;
	d3d_texture *smalltexture;
	d3d_surface *target[5];
	d3d_texture *texture[5];

	d3d_render_target *next;
	d3d_render_target *prev;

    d3d_surface *bloom_target[11];
    d3d_texture *bloom_texture[11];
};

/* d3d_info is the information about Direct3D for the current screen */
struct d3d_info
{
	int                     adapter;                    // ordinal adapter number
	int                     width, height;              // current width, height
	int                     refresh;                    // current refresh rate
	int                     create_error_count;         // number of consecutive create errors

	win_window_info *       window;                     // current window info

	d3d_device *            device;                     // pointer to the Direct3DDevice object
	int                     gamma_supported;            // is full screen gamma supported?
	d3d_present_parameters  presentation;               // set of presentation parameters
	D3DDISPLAYMODE          origmode;                   // original display mode for the adapter
	D3DFORMAT               pixformat;                  // pixel format we are using

	d3d_vertex_buffer *     vertexbuf;                  // pointer to the vertex buffer object
	d3d_vertex *            lockedbuf;                  // pointer to the locked vertex buffer
	int                     numverts;                   // number of accumulated vertices

	d3d_poly_info           poly[VERTEX_BUFFER_SIZE/3]; // array to hold polygons as they are created
	int                     numpolys;                   // number of accumulated polygons

	bool					restarting;					// if we're restarting

	d3d_texture_info *      texlist;                    // list of active textures
	int                     dynamic_supported;          // are dynamic textures supported?
	int                     stretch_supported;          // is StretchRect with point filtering supported?
	int                     mod2x_supported;            // is D3DTOP_MODULATE2X supported?
	int                     mod4x_supported;            // is D3DTOP_MODULATE4X supported?
	D3DFORMAT               screen_format;              // format to use for screen textures
	D3DFORMAT               yuv_format;                 // format to use for YUV textures

	DWORD                   texture_caps;               // textureCaps field
	DWORD                   texture_max_aspect;         // texture maximum aspect ratio
	DWORD                   texture_max_width;          // texture maximum width
	DWORD                   texture_max_height;         // texture maximum height

	d3d_texture_info *      last_texture;               // previous texture
	UINT32                  last_texture_flags;         // previous texture flags
	int                     last_blendenable;           // previous blendmode
	int                     last_blendop;               // previous blendmode
	int                     last_blendsrc;              // previous blendmode
	int                     last_blenddst;              // previous blendmode
	int                     last_filter;                // previous texture filter
	int                     last_wrap;                  // previous wrap state
	DWORD                   last_modmode;               // previous texture modulation

	bitmap_argb32           vector_bitmap;              // experimental: bitmap for vectors
	d3d_texture_info *      vector_texture;             // experimental: texture for vectors

	bitmap_rgb32            default_bitmap;             // experimental: default bitmap
	d3d_texture_info *      default_texture;            // experimental: default texture

	void *                  hlsl_buf;                   // HLSL vertex data
	hlsl_info *             hlsl;                       // HLSL interface
};



//============================================================
//  PROTOTYPES
//============================================================

d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, UINT32 flags);
void texture_destroy(d3d_info *d3d, d3d_texture_info *info);

#endif