blob: 3ab7651d87cecf2c8dd7b9cfdb51adcc96daa2a1 (
plain) (
tree)
|
|
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
//============================================================
//
// drawd3d.h - Win32 Direct3D header
//
//============================================================
#ifndef MAME_OSD_MODULES_RENDER_DRAWD3D_H
#define MAME_OSD_MODULES_RENDER_DRAWD3D_H
#pragma once
#include "d3d/d3dcomm.h"
#include "modules/lib/osdlib.h"
#include "modules/osdwindow.h"
#include "sliderdirtynotifier.h"
#include <windows.h>
#include <tchar.h>
#include <mmsystem.h>
#include <d3d9.h>
#include <d3dx9.h>
#undef interface
#include <memory>
#include <vector>
#include <cmath>
//============================================================
// CONSTANTS
//============================================================
#define VERTEX_BASE_FORMAT (D3DFVF_DIFFUSE | D3DFVF_TEX1 | D3DFVF_TEX2)
#define VERTEX_BUFFER_SIZE (40960*4+4)
//============================================================
// TYPE DEFINITIONS
//============================================================
class shaders;
struct hlsl_options;
/* renderer_d3d9 is the information about Direct3D for the current screen */
class renderer_d3d9 : public osd_renderer, public slider_dirty_notifier
{
public:
using IDirect3D9Ptr = Microsoft::WRL::ComPtr<IDirect3D9>;
renderer_d3d9(osd_window &window, const IDirect3D9Ptr &d3dobj);
virtual ~renderer_d3d9();
virtual int create() override;
virtual render_primitive_list *get_primitives() override;
virtual int draw(const int update) override;
virtual void save() override;
virtual void record() override;
virtual void toggle_fsfx() override;
virtual void add_audio_to_recording(const int16_t *buffer, int samples_this_frame) override;
virtual std::vector<ui::menu_item> get_slider_list() override;
virtual void set_sliders_dirty() override;
int initialize();
int device_create(HWND device_HWND);
int device_create_resources();
void device_delete();
void device_delete_resources();
void update_presentation_parameters();
void update_gamma_ramp();
bool device_verify_caps();
int device_test_cooperative();
int config_adapter_mode();
void pick_best_mode();
int get_adapter_for_monitor();
bool update_window_size();
int pre_window_draw_check();
void begin_frame();
void end_frame();
void draw_line(const render_primitive &prim);
void draw_quad(const render_primitive &prim);
void batch_vector(const render_primitive &prim);
void batch_vectors(int vector_count);
vertex * mesh_alloc(int numverts);
void process_primitives();
void primitive_flush_pending();
void set_texture(texture_info *texture);
void set_filter(int filter);
void set_wrap(unsigned int wrap);
void set_modmode(int modmode);
void set_blendmode(int blendmode);
void reset_render_states();
// Setters / getters
int get_adapter() const { return m_adapter; }
int get_width() const { return m_width; }
vec2f get_dims() const { return vec2f(m_width, m_height); }
int get_height() const { return m_height; }
int get_refresh() const { return m_refresh; }
bool post_fx_available() const { return m_post_fx_available; }
void set_post_fx_unavailable() { m_post_fx_available = false; }
IDirect3DDevice9 * get_device() const { return m_device.Get(); }
D3DPRESENT_PARAMETERS * get_presentation() { return &m_presentation; }
IDirect3DVertexBuffer9 *get_vertex_buffer() const { return m_vertexbuf.Get(); }
void set_toggle(bool toggle) { m_toggle = toggle; }
D3DFORMAT get_screen_format() const { return m_screen_format; }
D3DFORMAT get_pixel_format() const { return m_pixformat; }
D3DDISPLAYMODE get_origmode() const { return m_origmode; }
uint32_t get_last_texture_flags() const { return m_last_texture_flags; }
d3d_texture_manager * get_texture_manager() const { return m_texture_manager.get(); }
texture_info * get_default_texture();
shaders * get_shaders() const { return m_shaders.get(); }
private:
using IDirect3DDevice9Ptr = Microsoft::WRL::ComPtr<IDirect3DDevice9>;
using IDirect3DVertexBuffer9Ptr = Microsoft::WRL::ComPtr<IDirect3DVertexBuffer9>;
const IDirect3D9Ptr m_d3dobj; // Direct3D 9 API object
int m_adapter; // ordinal adapter number
int m_width; // current width
int m_height; // current height
int m_refresh; // current refresh rate
int m_create_error_count; // number of consecutive create errors
bool m_post_fx_available;
IDirect3DDevice9Ptr m_device; // pointer to the Direct3DDevice object
int m_gamma_supported; // is full screen gamma supported?
D3DPRESENT_PARAMETERS m_presentation; // set of presentation parameters
D3DDISPLAYMODE m_origmode; // original display mode for the adapter
D3DFORMAT m_pixformat; // pixel format we are using
IDirect3DVertexBuffer9Ptr m_vertexbuf; // pointer to the vertex buffer object
vertex * m_lockedbuf; // pointer to the locked vertex buffer
int m_numverts; // number of accumulated vertices
vertex * m_vectorbatch; // pointer to the vector batch buffer
int m_batchindex; // current index into the vector batch
poly_info m_poly[VERTEX_BUFFER_SIZE/3];// array to hold polygons as they are created
int m_numpolys; // number of accumulated polygons
bool m_toggle; // if we're toggle fsfx
D3DFORMAT m_screen_format; // format to use for screen textures
texture_info * m_last_texture; // previous texture
uint32_t m_last_texture_flags; // previous texture flags
int m_last_blendenable; // previous blendmode
int m_last_blendop; // previous blendmode
int m_last_blendsrc; // previous blendmode
int m_last_blenddst; // previous blendmode
int m_last_filter; // previous texture filter
uint32_t m_last_wrap; // previous wrap state
int m_last_modmode; // previous texture modulation
std::unique_ptr<shaders> m_shaders; // HLSL interface
std::unique_ptr<d3d_texture_manager> m_texture_manager; // texture manager
};
#endif // MAME_OSD_MODULES_RENDER_DRAWD3D_H
|