Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.72 KB | None | 0 0
  1. diff --git a/mythtv/libs/libmythui/mythrender_d3d9.cpp b/mythtv/libs/libmythui/mythrender_d3d9.cpp
  2. index 9afb06c..76a44c6 100644
  3. --- a/mythtv/libs/libmythui/mythrender_d3d9.cpp
  4. +++ b/mythtv/libs/libmythui/mythrender_d3d9.cpp
  5. @@ -141,6 +141,10 @@ QRect D3D9Image::GetRect(void)
  6. return m_render->GetRect(m_vertexbuffer);
  7. }
  8.  
  9. +#define mD3DFMT_YV12 (D3DFORMAT)MAKEFOURCC('Y','V','1','2')
  10. +#define mD3DFMT_IYUV (D3DFORMAT)MAKEFOURCC('I','Y','U','V')
  11. +#define mD3DFMT_I420 (D3DFORMAT)MAKEFOURCC('I','4','2','0')
  12. +#define mD3DFMT_YV16 (D3DFORMAT)MAKEFOURCC('Y','V','1','6')
  13. #define D3DFVF_TEXTUREVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1|D3DFVF_TEX2)
  14. #define D3DFVF_VERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
  15. #define D3DLOC QString("MythRenderD3D9: ")
  16. @@ -149,8 +153,8 @@ QRect D3D9Image::GetRect(void)
  17. MythRenderD3D9::MythRenderD3D9(void)
  18. : m_d3d(NULL), m_d3dDevice(NULL),
  19. m_adaptor_fmt(D3DFMT_UNKNOWN),
  20. - m_videosurface_fmt((D3DFORMAT)MAKEFOURCC('Y','V','1','2')),
  21. - m_surface_fmt(D3DFMT_A8R8G8B8), m_texture_fmt(D3DFMT_A8R8G8B8),
  22. + m_videosurface_fmt(D3DFMT_UNKNOWN),
  23. + m_surface_fmt(D3DFMT_UNKNOWN), m_texture_fmt(D3DFMT_A8R8G8B8),
  24. m_rect_vertexbuffer(NULL), m_default_surface(NULL), m_current_surface(NULL),
  25. m_lock(QMutex::Recursive),
  26. m_blend(true), m_multi_texturing(true), m_texture_vertices(true)
  27. @@ -196,6 +200,7 @@ bool MythRenderD3D9::FormatSupported(D3DFORMAT surface, D3DFORMAT adaptor)
  28. adaptor, 0, D3DRTYPE_SURFACE, surface);
  29. if (SUCCEEDED(hr))
  30. {
  31. + // NB CheckDeviceFormatConversion is not fuly implemented in Wine as of 1.3.6
  32. hr = m_d3d->CheckDeviceFormatConversion(D3DADAPTER_DEFAULT,
  33. D3DDEVTYPE_HAL, surface, adaptor);
  34. if (SUCCEEDED(hr))
  35. @@ -206,7 +211,6 @@ bool MythRenderD3D9::FormatSupported(D3DFORMAT surface, D3DFORMAT adaptor)
  36.  
  37. static const QString toString(D3DFORMAT fmt)
  38. {
  39. - QString res = "Unknown";
  40. switch (fmt)
  41. {
  42. case D3DFMT_A8:
  43. @@ -215,10 +219,26 @@ static const QString toString(D3DFORMAT fmt)
  44. return "A8R8G8B8";
  45. case D3DFMT_X8R8G8B8:
  46. return "X8R8G8B8";
  47. + case D3DFMT_A8B8G8R8:
  48. + return "A8B8G8R8";
  49. + case D3DFMT_X8B8G8R8:
  50. + return "X8B8G8R8";
  51. + case mD3DFMT_YV12:
  52. + return "YV12";
  53. + case D3DFMT_UYVY:
  54. + return "UYVY";
  55. + case D3DFMT_YUY2:
  56. + return "YUY2";
  57. + case mD3DFMT_IYUV:
  58. + return "IYUV";
  59. + case mD3DFMT_I420:
  60. + return "I420";
  61. + case mD3DFMT_YV16:
  62. + return "YV16";
  63. default:
  64. - return res;
  65. + break;
  66. }
  67. - return res;
  68. + return QString().setNum((ulong)fmt,16);
  69. }
  70.  
  71. bool MythRenderD3D9::Create(QSize size, HWND window)
  72. @@ -228,7 +248,6 @@ bool MythRenderD3D9::Create(QSize size, HWND window)
  73. typedef LPDIRECT3D9 (WINAPI *LPFND3DC)(UINT SDKVersion);
  74. static HINSTANCE hD3DLib = NULL;
  75. static LPFND3DC OurDirect3DCreate9 = NULL;
  76. - D3DCAPS9 d3dCaps;
  77.  
  78. if (!hD3DLib)
  79. {
  80. @@ -256,12 +275,12 @@ bool MythRenderD3D9::Create(QSize size, HWND window)
  81. return false;
  82. }
  83.  
  84. + D3DCAPS9 d3dCaps;
  85. ZeroMemory(&d3dCaps, sizeof(d3dCaps));
  86. if (D3D_OK != m_d3d->GetDeviceCaps(
  87. D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dCaps))
  88. {
  89. VERBOSE(VB_IMPORTANT, D3DERR + "Could not read adapter capabilities.");
  90. - return false;
  91. }
  92.  
  93. D3DDISPLAYMODE d3ddm;
  94. @@ -271,28 +290,77 @@ bool MythRenderD3D9::Create(QSize size, HWND window)
  95. return false;
  96. }
  97.  
  98. - // TODO - check adaptor format is reasonable and try alternatives
  99. m_adaptor_fmt = d3ddm.Format;
  100. - bool default_ok = FormatSupported(m_videosurface_fmt, m_adaptor_fmt);
  101. - if (!default_ok)
  102. - m_videosurface_fmt = m_adaptor_fmt;
  103. -
  104. VERBOSE(VB_GENERAL, D3DLOC +
  105. - QString("Default Adaptor Format %1 - Hardware YV12 to RGB %2 ")
  106. - .arg(toString(m_adaptor_fmt))
  107. - .arg(default_ok ? "supported" : "unsupported"));
  108. -
  109. - // TODO - try alternative formats if necessary
  110. - if (!FormatSupported(m_surface_fmt, m_adaptor_fmt))
  111. - VERBOSE(VB_IMPORTANT, D3DERR + QString("%1 surface format not supported.")
  112. - .arg(toString(m_surface_fmt)));
  113. + QString("Default Adaptor Format %1.").arg(toString(m_adaptor_fmt)));
  114. +
  115. + // Find the best h/w supported video surface format
  116. + static const D3DFORMAT vfmt[] =
  117. + {
  118. + mD3DFMT_YV12,
  119. + D3DFMT_UYVY,
  120. + D3DFMT_YUY2,
  121. + mD3DFMT_IYUV,
  122. + mD3DFMT_I420,
  123. + mD3DFMT_YV16,
  124. + D3DFMT_A8R8G8B8,
  125. + D3DFMT_X8R8G8B8,
  126. + D3DFMT_A8B8G8R8,
  127. + D3DFMT_X8B8G8R8
  128. + };
  129. +
  130. + for (unsigned i = 0; i < sizeof vfmt / sizeof vfmt[0]; ++i)
  131. + {
  132. + if (FormatSupported(vfmt[i], m_adaptor_fmt))
  133. + {
  134. + m_videosurface_fmt = vfmt[i];
  135. + break;
  136. + }
  137. + }
  138. +
  139. + if (D3DFMT_UNKNOWN != m_videosurface_fmt)
  140. + {
  141. + VERBOSE(VB_GENERAL, D3DLOC +
  142. + QString("Best Video Surface Format %1.").arg(toString(m_videosurface_fmt)));
  143. + }
  144. + else
  145. + {
  146. + VERBOSE(VB_IMPORTANT, D3DERR + "Failed to agree video surface format");
  147. + }
  148. +
  149. + // Find the best backing surface format
  150. + static const D3DFORMAT bfmt[] =
  151. + {
  152. + D3DFMT_A8R8G8B8,
  153. + D3DFMT_X8R8G8B8,
  154. + D3DFMT_A8B8G8R8,
  155. + D3DFMT_X8B8G8R8,
  156. + D3DFMT_R8G8B8
  157. + };
  158. +
  159. + for (unsigned i = 0; i < sizeof bfmt / sizeof bfmt[0]; ++i)
  160. + {
  161. + if (SUCCEEDED(m_d3d->CheckDeviceType(D3DADAPTER_DEFAULT,
  162. + D3DDEVTYPE_HAL, m_adaptor_fmt, bfmt[i], TRUE)))
  163. + {
  164. + m_surface_fmt = bfmt[i];
  165. + break;
  166. + }
  167. + }
  168. +
  169. + if (D3DFMT_UNKNOWN != m_surface_fmt)
  170. + {
  171. + VERBOSE(VB_GENERAL, D3DLOC +
  172. + QString("Best surface format: %1.").arg(toString(m_surface_fmt)));
  173. + }
  174. else
  175. - VERBOSE(VB_GENERAL, D3DLOC + QString("Using %1 surface format.")
  176. - .arg(toString(m_surface_fmt)));
  177. + {
  178. + VERBOSE(VB_IMPORTANT, D3DERR + "Failed to agree surface format");
  179. + }
  180.  
  181. D3DPRESENT_PARAMETERS d3dpp;
  182. ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
  183. - d3dpp.BackBufferFormat = m_adaptor_fmt;
  184. + d3dpp.BackBufferFormat = m_surface_fmt;
  185. d3dpp.hDeviceWindow = window;
  186. d3dpp.Windowed = TRUE;
  187. d3dpp.BackBufferWidth = size.width();
  188. @@ -312,10 +380,19 @@ bool MythRenderD3D9::Create(QSize size, HWND window)
  189. return false;
  190. }
  191.  
  192. + VERBOSE(VB_GENERAL, D3DLOC + QString("Device backbuffer format: %1.")
  193. + .arg(toString(d3dpp.BackBufferFormat)));
  194. +
  195. + if (D3DFMT_UNKNOWN == m_videosurface_fmt)
  196. + m_videosurface_fmt = d3dpp.BackBufferFormat;
  197. +
  198. + if (D3DFMT_UNKNOWN == m_surface_fmt)
  199. + m_surface_fmt = d3dpp.BackBufferFormat;
  200. +
  201. VERBOSE(VB_GENERAL, D3DLOC +
  202. QString("Hardware YV12 to RGB conversion %1.")
  203. .arg(m_videosurface_fmt != (D3DFORMAT)MAKEFOURCC('Y','V','1','2') ?
  204. - "unavailable" : "enabled"));
  205. + "unavailable" : "available"));
  206.  
  207. static bool debugged = false;
  208. if (!debugged)
  209. @@ -742,22 +819,25 @@ bool MythRenderD3D9::UpdateSurface(IDirect3DSurface9 *surface,
  210. return false;
  211.  
  212. D3DFORMAT format = m_surfaces[surface].m_fmt;
  213. - if (format == D3DFMT_A8R8G8B8)
  214. + switch (format)
  215. {
  216. - int i;
  217. - uint pitch = image->width() << 2;
  218. - uint8_t *dst = buf;
  219. - uint8_t *src = (uint8_t*)image->bits();
  220. - for (i = 0; i < image->height(); i++)
  221. - {
  222. - memcpy(dst, src, pitch);
  223. - dst += d3dpitch;
  224. - src += pitch;
  225. - }
  226. - }
  227. - else
  228. - {
  229. - VERBOSE(VB_IMPORTANT, D3DERR + "Surface format not supported.");
  230. + case D3DFMT_A8R8G8B8:
  231. + case D3DFMT_X8R8G8B8:
  232. + {
  233. + uint pitch = image->width() << 2;
  234. + uint8_t *dst = buf;
  235. + uint8_t *src = (uint8_t*)image->bits();
  236. + for (int i = 0; i < image->height(); i++)
  237. + {
  238. + memcpy(dst, src, pitch);
  239. + dst += d3dpitch;
  240. + src += pitch;
  241. + }
  242. + }
  243. + break;
  244. + default:
  245. + VERBOSE(VB_IMPORTANT, D3DERR + "Surface format not supported.");
  246. + break;
  247. }
  248.  
  249. ReleaseBuffer(surface);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement