00001 #ifndef MYTHRENDER_D3D9_H
00002 #define MYTHRENDER_D3D9_H
00003
00004 #include <QMap>
00005
00006 #include <compat.h>
00007 #include <d3d9.h>
00008
00009 #include "mythimage.h"
00010 #include "mythuiexp.h"
00011 #include "mythrender_base.h"
00012
00013 #ifdef USING_DXVA2
00014 #include "dxva2api.h"
00015 #else
00016 typedef void* IDirect3DDeviceManager9;
00017 #endif
00018
00019 class MythD3DVertexBuffer;
00020 class MythD3DSurface;
00021 class MythRenderD3D9;
00022
00023 class MUI_PUBLIC D3D9Image
00024 {
00025 public:
00026 D3D9Image(MythRenderD3D9 *render, QSize size, bool video = false);
00027 ~D3D9Image();
00028
00029 bool IsValid(void) const { return m_valid; }
00030 QSize GetSize(void) const { return m_size; }
00031 int GetDataSize(void) const { return m_size.width() * m_size.height() * 4; }
00032 bool SetAsRenderTarget(void);
00033 bool UpdateImage(IDirect3DSurface9 *surface);
00034 bool UpdateImage(const MythImage *img);
00035 bool UpdateVertices(const QRect &dvr, const QRect &vr, int alpha = 255,
00036 bool video = false);
00037 bool Draw(void);
00038 uint8_t* GetBuffer(bool &hardware_conv, uint &pitch);
00039 void ReleaseBuffer(void);
00040 QRect GetRect(void);
00041
00042 private:
00043 QSize m_size;
00044 bool m_valid;
00045 MythRenderD3D9 *m_render;
00046 IDirect3DVertexBuffer9 *m_vertexbuffer;
00047 IDirect3DTexture9 *m_texture;
00048 IDirect3DSurface9 *m_surface;
00049 };
00050
00051 class MUI_PUBLIC D3D9Locker
00052 {
00053 public:
00054 D3D9Locker(MythRenderD3D9 *render);
00055 ~D3D9Locker();
00056 IDirect3DDevice9* Acquire(void);
00057 private:
00058 MythRenderD3D9 *m_render;
00059 };
00060
00061 class MUI_PUBLIC MythRenderD3D9 : public MythRender
00062 {
00063 public:
00064 static void* ResolveAddress(const char* lib, const char* proc);
00065
00066 MythRenderD3D9();
00067 ~MythRenderD3D9();
00068
00069 bool Create(QSize size, HWND window);
00070 bool Test(bool &reset);
00071
00072 bool ClearBuffer(void);
00073 bool Begin(void);
00074 bool End(void);
00075 void CopyFrame(void* surface, D3D9Image *img);
00076 bool StretchRect(IDirect3DTexture9 *texture, IDirect3DSurface9 *surface,
00077 bool known_surface = true);
00078 bool DrawTexturedQuad(IDirect3DVertexBuffer9 *vertexbuffer);
00079 void DrawRect(const QRect &rect, const QColor &color, int alpha);
00080 bool Present(HWND win);
00081 bool HardwareYUVConversion(void);
00082 QRect GetRect(IDirect3DVertexBuffer9 *vertexbuffer);
00083 bool SetRenderTarget(IDirect3DTexture9 *texture);
00084
00085 IDirect3DTexture9* CreateTexture(const QSize &size);
00086 void DeleteTexture(IDirect3DTexture9* texture);
00087
00088 IDirect3DVertexBuffer9* CreateVertexBuffer(IDirect3DTexture9* texture = NULL);
00089 bool UpdateVertexBuffer(IDirect3DVertexBuffer9* vertexbuffer,
00090 const QRect &dvr, const QRect &vr,
00091 int alpha = 255, bool video = false);
00092 void DeleteVertexBuffer(IDirect3DVertexBuffer9* vertexbuffer);
00093
00094 IDirect3DSurface9* CreateSurface(const QSize &size, bool video = false);
00095 bool UpdateSurface(IDirect3DSurface9* surface,
00096 const MythImage *image);
00097 void DeleteSurface(IDirect3DSurface9* surface);
00098 uint8_t* GetBuffer(IDirect3DSurface9* surface, uint &pitch);
00099 void ReleaseBuffer(IDirect3DSurface9* surface);
00100
00101 private:
00102 bool SetTexture(IDirect3DDevice9* dev,
00103 IDirect3DTexture9 *texture,
00104 int num = 0);
00105 void DeleteTextures(void);
00106 void DeleteVertexBuffers(void);
00107 void DeleteSurfaces(void);
00108 void Init2DState(void);
00109 void EnableBlending(IDirect3DDevice9* dev, bool enable);
00110 void MultiTexturing(IDirect3DDevice9* dev, bool enable,
00111 IDirect3DTexture9 *texture = NULL);
00112 void SetTextureVertices(IDirect3DDevice9* dev, bool enable);
00113
00114 private:
00115 QMap<IDirect3DTexture9*, QSize> m_textures;
00116 QMap<IDirect3DVertexBuffer9*, MythD3DVertexBuffer> m_vertexbuffers;
00117 QMap<IDirect3DSurface9*, MythD3DSurface> m_surfaces;
00118
00119 IDirect3D9 *m_d3d;
00120 IDirect3DDevice9 *m_rootD3DDevice;
00121 D3DFORMAT m_adaptor_fmt;
00122 D3DFORMAT m_videosurface_fmt;
00123 D3DFORMAT m_surface_fmt;
00124 D3DFORMAT m_texture_fmt;
00125 IDirect3DVertexBuffer9 *m_rect_vertexbuffer;
00126 IDirect3DSurface9 *m_default_surface;
00127 IDirect3DSurface9 *m_current_surface;
00128
00129 QMutex m_lock;
00130 bool m_blend;
00131 bool m_multi_texturing;
00132 bool m_texture_vertices;
00133
00134 public:
00135 IDirect3DDevice9* AcquireDevice(void);
00136 void ReleaseDevice(void);
00137 IDirect3DDeviceManager9* GetDeviceManager(void) { return m_deviceManager; }
00138
00139 private:
00140 void CreateDeviceManager(void);
00141 void DestroyDeviceManager(void);
00142
00143 private:
00144 IDirect3DDeviceManager9 *m_deviceManager;
00145 HANDLE m_deviceHandle;
00146 uint m_deviceManagerToken;
00147 };
00148
00149 #endif // MYTHRENDER_D3D9_H