207
207
static int D3D_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
208
208
const SDL_Rect * rect, const void *pixels,
210
static int D3D_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
211
const SDL_Rect * rect,
212
const Uint8 *Yplane, int Ypitch,
213
const Uint8 *Uplane, int Upitch,
214
const Uint8 *Vplane, int Vpitch);
210
215
static int D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
211
216
const SDL_Rect * rect, void **pixels, int *pitch);
212
217
static void D3D_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
404
D3D_InitRenderState(D3D_RenderData *data)
408
IDirect3DDevice9 *device = data->device;
410
IDirect3DDevice9_SetVertexShader(device, NULL);
411
IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
412
IDirect3DDevice9_SetRenderState(device, D3DRS_ZENABLE, D3DZB_FALSE);
413
IDirect3DDevice9_SetRenderState(device, D3DRS_CULLMODE, D3DCULL_NONE);
414
IDirect3DDevice9_SetRenderState(device, D3DRS_LIGHTING, FALSE);
416
/* Enable color modulation by diffuse color */
417
IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP,
419
IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1,
421
IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG2,
424
/* Enable alpha modulation by diffuse alpha */
425
IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAOP,
427
IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAARG1,
429
IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_ALPHAARG2,
432
/* Enable separate alpha blend function, if possible */
433
if (data->enableSeparateAlphaBlend) {
434
IDirect3DDevice9_SetRenderState(device, D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
437
/* Disable second texture stage, since we're done */
438
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_COLOROP,
440
IDirect3DDevice9_SetTextureStageState(device, 1, D3DTSS_ALPHAOP,
443
/* Set an identity world and view matrix */
444
matrix.m[0][0] = 1.0f;
445
matrix.m[0][1] = 0.0f;
446
matrix.m[0][2] = 0.0f;
447
matrix.m[0][3] = 0.0f;
448
matrix.m[1][0] = 0.0f;
449
matrix.m[1][1] = 1.0f;
450
matrix.m[1][2] = 0.0f;
451
matrix.m[1][3] = 0.0f;
452
matrix.m[2][0] = 0.0f;
453
matrix.m[2][1] = 0.0f;
454
matrix.m[2][2] = 1.0f;
455
matrix.m[2][3] = 0.0f;
456
matrix.m[3][0] = 0.0f;
457
matrix.m[3][1] = 0.0f;
458
matrix.m[3][2] = 0.0f;
459
matrix.m[3][3] = 1.0f;
460
IDirect3DDevice9_SetTransform(device, D3DTS_WORLD, &matrix);
461
IDirect3DDevice9_SetTransform(device, D3DTS_VIEW, &matrix);
463
/* Reset our current scale mode */
464
SDL_memset(data->scaleMode, 0xFF, sizeof(data->scaleMode));
466
/* Start the render with beginScene */
467
data->beginScene = SDL_TRUE;
399
471
D3D_Reset(SDL_Renderer * renderer)
416
488
return D3D_SetError("Reset()", result);
419
IDirect3DDevice9_SetVertexShader(data->device, NULL);
420
IDirect3DDevice9_SetFVF(data->device,
421
D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
422
IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE,
424
IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE);
425
492
IDirect3DDevice9_GetRenderTarget(data->device, 0, &data->defaultRenderTarget);
426
SDL_memset(data->scaleMode, 0xFF, sizeof(data->scaleMode));
493
D3D_InitRenderState(data);
427
494
D3D_UpdateViewport(renderer);
502
data->d3dDLL = SDL_LoadObject("D3D9.DLL");
504
IDirect3D9 *(WINAPI * D3DCreate) (UINT SDKVersion);
507
(IDirect3D9 * (WINAPI *) (UINT)) SDL_LoadFunction(data->d3dDLL,
510
data->d3d = D3DCreate(D3D_SDK_VERSION);
513
SDL_UnloadObject(data->d3dDLL);
571
if( D3D_LoadDLL( &data->d3dDLL, &data->d3d ) ) {
517
572
for (d3dxVersion=50;d3dxVersion>0;d3dxVersion--) {
519
574
SDL_snprintf(d3dxDLLFile, sizeof(d3dxDLLFile), "D3DX9_%02d.dll", d3dxVersion);
547
600
renderer->WindowEvent = D3D_WindowEvent;
548
601
renderer->CreateTexture = D3D_CreateTexture;
549
602
renderer->UpdateTexture = D3D_UpdateTexture;
603
renderer->UpdateTextureYUV = D3D_UpdateTextureYUV;
550
604
renderer->LockTexture = D3D_LockTexture;
551
605
renderer->UnlockTexture = D3D_UnlockTexture;
552
606
renderer->SetRenderTarget = D3D_SetRenderTarget;
606
660
pparams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
609
/* FIXME: Which adapter? */
610
data->adapter = D3DADAPTER_DEFAULT;
663
/* Get the adapter for the display that the window is on */
664
displayIndex = SDL_GetWindowDisplayIndex( window );
665
data->adapter = SDL_Direct3D9GetAdapterIndex( displayIndex );
611
667
IDirect3D9_GetDeviceCaps(data->d3d, data->adapter, D3DDEVTYPE_HAL, &caps);
669
device_flags = D3DCREATE_FPU_PRESERVE;
670
if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) {
671
device_flags |= D3DCREATE_HARDWARE_VERTEXPROCESSING;
673
device_flags |= D3DCREATE_SOFTWARE_VERTEXPROCESSING;
676
hint = SDL_GetHint(SDL_HINT_RENDER_DIRECT3D_THREADSAFE);
677
if (hint && SDL_atoi(hint)) {
678
device_flags |= D3DCREATE_MULTITHREADED;
613
681
result = IDirect3D9_CreateDevice(data->d3d, data->adapter,
615
683
pparams.hDeviceWindow,
616
D3DCREATE_FPU_PRESERVE | ((caps.
618
D3DDEVCAPS_HWTRANSFORMANDLIGHT) ?
619
D3DCREATE_HARDWARE_VERTEXPROCESSING :
620
D3DCREATE_SOFTWARE_VERTEXPROCESSING),
621
685
&pparams, &data->device);
622
686
if (FAILED(result)) {
623
687
D3D_DestroyRenderer(renderer);
624
688
D3D_SetError("CreateDevice()", result);
627
data->beginScene = SDL_TRUE;
628
SDL_memset(data->scaleMode, 0xFF, sizeof(data->scaleMode));
630
692
/* Get presentation parameters to fill info */
631
693
result = IDirect3DDevice9_GetSwapChain(data->device, 0, &chain);
658
720
data->enableSeparateAlphaBlend = SDL_TRUE;
661
/* Set up parameters for rendering */
662
IDirect3DDevice9_SetVertexShader(data->device, NULL);
663
IDirect3DDevice9_SetFVF(data->device,
664
D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
665
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ZENABLE, D3DZB_FALSE);
666
IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE,
668
IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE);
669
/* Enable color modulation by diffuse color */
670
IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_COLOROP,
672
IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_COLORARG1,
674
IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_COLORARG2,
676
/* Enable alpha modulation by diffuse alpha */
677
IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAOP,
679
IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAARG1,
681
IDirect3DDevice9_SetTextureStageState(data->device, 0, D3DTSS_ALPHAARG2,
683
/* Enable separate alpha blend function, if possible */
684
if (data->enableSeparateAlphaBlend) {
685
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
687
/* Disable second texture stage, since we're done */
688
IDirect3DDevice9_SetTextureStageState(data->device, 1, D3DTSS_COLOROP,
690
IDirect3DDevice9_SetTextureStageState(data->device, 1, D3DTSS_ALPHAOP,
693
723
/* Store the default render target */
694
724
IDirect3DDevice9_GetRenderTarget(data->device, 0, &data->defaultRenderTarget );
695
725
data->currentRenderTarget = NULL;
697
/* Set an identity world and view matrix */
698
matrix.m[0][0] = 1.0f;
699
matrix.m[0][1] = 0.0f;
700
matrix.m[0][2] = 0.0f;
701
matrix.m[0][3] = 0.0f;
702
matrix.m[1][0] = 0.0f;
703
matrix.m[1][1] = 1.0f;
704
matrix.m[1][2] = 0.0f;
705
matrix.m[1][3] = 0.0f;
706
matrix.m[2][0] = 0.0f;
707
matrix.m[2][1] = 0.0f;
708
matrix.m[2][2] = 1.0f;
709
matrix.m[2][3] = 0.0f;
710
matrix.m[3][0] = 0.0f;
711
matrix.m[3][1] = 0.0f;
712
matrix.m[3][2] = 0.0f;
713
matrix.m[3][3] = 1.0f;
714
IDirect3DDevice9_SetTransform(data->device, D3DTS_WORLD, &matrix);
715
IDirect3DDevice9_SetTransform(data->device, D3DTS_VIEW, &matrix);
727
/* Set up parameters for rendering */
728
D3D_InitRenderState(data);
717
730
if (caps.MaxSimultaneousTextures >= 3)
1030
D3D_UpdateTextureYUV(SDL_Renderer * renderer, SDL_Texture * texture,
1031
const SDL_Rect * rect,
1032
const Uint8 *Yplane, int Ypitch,
1033
const Uint8 *Uplane, int Upitch,
1034
const Uint8 *Vplane, int Vpitch)
1036
D3D_TextureData *data = (D3D_TextureData *) texture->driverdata;
1037
SDL_bool full_texture = SDL_FALSE;
1039
#ifdef USE_DYNAMIC_TEXTURE
1040
if (texture->access == SDL_TEXTUREACCESS_STREAMING &&
1041
rect->x == 0 && rect->y == 0 &&
1042
rect->w == texture->w && rect->h == texture->h) {
1043
full_texture = SDL_TRUE;
1047
if (D3D_UpdateTextureInternal(data->texture, texture->format, full_texture, rect->x, rect->y, rect->w, rect->h, Yplane, Ypitch) < 0) {
1050
if (D3D_UpdateTextureInternal(data->utexture, texture->format, full_texture, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Uplane, Upitch) < 0) {
1053
if (D3D_UpdateTextureInternal(data->vtexture, texture->format, full_texture, rect->x / 2, rect->y / 2, rect->w / 2, rect->h / 2, Vplane, Vpitch) < 0) {
1017
1060
D3D_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
1018
1061
const SDL_Rect * rect, void **pixels, int *pitch)
1181
1225
color = D3DCOLOR_ARGB(renderer->a, renderer->r, renderer->g, renderer->b);
1227
if (renderer->target) {
1228
BackBufferWidth = renderer->target->w;
1229
BackBufferHeight = renderer->target->h;
1231
BackBufferWidth = data->pparams.BackBufferWidth;
1232
BackBufferHeight = data->pparams.BackBufferHeight;
1183
1235
/* Don't reset the viewport if we don't have to! */
1184
1236
if (!renderer->viewport.x && !renderer->viewport.y &&
1185
renderer->viewport.w == data->pparams.BackBufferWidth &&
1186
renderer->viewport.h == data->pparams.BackBufferHeight) {
1237
renderer->viewport.w == BackBufferWidth &&
1238
renderer->viewport.h == BackBufferHeight) {
1187
1239
result = IDirect3DDevice9_Clear(data->device, 0, NULL, D3DCLEAR_TARGET, color, 0.0f, 0);
1189
1241
D3DVIEWPORT9 viewport;
1839
1891
SDL_free(renderer);
1895
SDL_RenderGetD3D9Device(SDL_Renderer * renderer)
1897
D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
1898
IDirect3DDevice9 *device;
1900
// Make sure that this is a D3D renderer
1901
if (renderer->DestroyRenderer != D3D_DestroyRenderer) {
1902
SDL_SetError("Renderer is not a D3D renderer");
1906
device = data->device;
1908
IDirect3DDevice9_AddRef( device );
1842
1913
#endif /* SDL_VIDEO_RENDER_D3D && !SDL_RENDER_DISABLED */
1844
1915
/* vi: set ts=4 sw=4 expandtab: */