(Xbox 1) Cleanups to IoSupport.cpp / Surface.cpp

This commit is contained in:
Twinaphex 2012-08-04 03:50:10 +02:00
parent 770123eb74
commit 7ca0637418
3 changed files with 125 additions and 123 deletions

View File

@ -31,6 +31,7 @@
#define POSITION_Y_BEGIN (POSITION_Y_START + POSITION_Y_INCREMENT)
#define POSITION_Y_INCREMENT 0.035f
#define COMMENT_Y_POSITION 0.83f
#elif defined(_XBOX1)
#define DEVICE_CAST xdk_d3d_video_t*
#define input_ptr input_xinput

View File

@ -24,106 +24,107 @@
HRESULT xbox_io_mount(char *szDrive, char *szDevice)
{
char szSourceDevice[48];
char szDestinationDrive[16];
char szSourceDevice[48];
char szDestinationDrive[16];
snprintf(szSourceDevice, sizeof(szSourceDevice), "\\Device\\%s", szDevice);
snprintf(szDestinationDrive, sizeof(szDestinationDrive), "\\??\\%s", szDrive);
snprintf(szSourceDevice, sizeof(szSourceDevice), "\\Device\\%s", szDevice);
snprintf(szDestinationDrive, sizeof(szDestinationDrive), "\\??\\%s", szDrive);
STRING DeviceName =
{
strlen(szSourceDevice),
strlen(szSourceDevice) + 1,
szSourceDevice
};
STRING DeviceName =
{
strlen(szSourceDevice),
strlen(szSourceDevice) + 1,
szSourceDevice
};
STRING LinkName =
{
strlen(szDestinationDrive),
strlen(szDestinationDrive) + 1,
szDestinationDrive
};
STRING LinkName =
{
strlen(szDestinationDrive),
strlen(szDestinationDrive) + 1,
szDestinationDrive
};
IoCreateSymbolicLink(&LinkName, &DeviceName);
IoCreateSymbolicLink(&LinkName, &DeviceName);
return S_OK;
return S_OK;
}
HRESULT xbox_io_unmount(char *szDrive)
{
char szDestinationDrive[16];
snprintf(szDestinationDrive, sizeof(szDestinationDrive), "\\??\\%s", szDrive);
char szDestinationDrive[16];
snprintf(szDestinationDrive, sizeof(szDestinationDrive), "\\??\\%s", szDrive);
STRING LinkName =
{
strlen(szDestinationDrive),
strlen(szDestinationDrive) + 1,
szDestinationDrive
};
STRING LinkName =
{
strlen(szDestinationDrive),
strlen(szDestinationDrive) + 1,
szDestinationDrive
};
IoDeleteSymbolicLink(&LinkName);
IoDeleteSymbolicLink(&LinkName);
return S_OK;
return S_OK;
}
HRESULT xbox_io_remount(char *szDrive, char *szDevice)
{
char szSourceDevice[48];
snprintf(szSourceDevice, sizeof(szSourceDevice), "\\Device\\%s", szDevice);
char szSourceDevice[48];
snprintf(szSourceDevice, sizeof(szSourceDevice), "\\Device\\%s", szDevice);
xbox_io_unmount(szDrive);
xbox_io_unmount(szDrive);
ANSI_STRING filename;
OBJECT_ATTRIBUTES attributes;
IO_STATUS_BLOCK status;
HANDLE hDevice;
NTSTATUS error;
DWORD dummy;
ANSI_STRING filename;
OBJECT_ATTRIBUTES attributes;
IO_STATUS_BLOCK status;
HANDLE hDevice;
NTSTATUS error;
DWORD dummy;
RtlInitAnsiString(&filename, szSourceDevice);
InitializeObjectAttributes(&attributes, &filename, OBJ_CASE_INSENSITIVE, NULL);
RtlInitAnsiString(&filename, szSourceDevice);
InitializeObjectAttributes(&attributes, &filename, OBJ_CASE_INSENSITIVE, NULL);
if (!NT_SUCCESS(error = NtCreateFile(&hDevice, GENERIC_READ |
if (!NT_SUCCESS(error = NtCreateFile(&hDevice, GENERIC_READ |
SYNCHRONIZE | FILE_READ_ATTRIBUTES, &attributes, &status, NULL, 0,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OPEN,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT)))
{
return E_FAIL;
}
{
return E_FAIL;
}
if (!DeviceIoControl(hDevice, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &dummy, NULL))
{
CloseHandle(hDevice);
return E_FAIL;
}
if (!DeviceIoControl(hDevice, FSCTL_DISMOUNT_VOLUME, NULL, 0, NULL, 0, &dummy, NULL))
{
CloseHandle(hDevice);
return E_FAIL;
}
CloseHandle(hDevice);
xbox_io_mount(szDrive, szDevice);
CloseHandle(hDevice);
xbox_io_mount(szDrive, szDevice);
return S_OK;
return S_OK;
}
HRESULT xbox_io_remap(char *szMapping)
{
char szMap[32];
strlcpy(szMap, szMapping, sizeof(szMap));
char szMap[32];
strlcpy(szMap, szMapping, sizeof(szMap));
char *pComma = strstr(szMap, ",");
if (pComma)
{
*pComma = 0;
char *pComma = strstr(szMap, ",");
// map device to drive letter
xbox_io_unmount(szMap);
xbox_io_mount(szMap, &pComma[1]);
return S_OK;
}
if (pComma)
{
*pComma = 0;
return E_FAIL;
// map device to drive letter
xbox_io_unmount(szMap);
xbox_io_mount(szMap, &pComma[1]);
return S_OK;
}
return E_FAIL;
}
HRESULT xbox_io_shutdown(void)
{
HalInitiateShutdown();
return S_OK;
}
HalInitiateShutdown();
return S_OK;
}

View File

@ -22,10 +22,10 @@ bool d3d_surface_new(d3d_surface_t *surface, const char *filename)
{
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;
surface->m_pTexture = NULL;
surface->m_pVertexBuffer = NULL;
surface->m_pTexture = NULL;
surface->m_pVertexBuffer = NULL;
HRESULT ret = D3DXCreateTextureFromFileExA(d3d->d3d_render_device, // d3d device
HRESULT ret = D3DXCreateTextureFromFileExA(d3d->d3d_render_device, // d3d device
filename, // filename
D3DX_DEFAULT, // width
D3DX_DEFAULT, // height
@ -40,93 +40,93 @@ bool d3d_surface_new(d3d_surface_t *surface, const char *filename)
NULL, // pallete
&surface->m_pTexture); // texture
if (FAILED(ret))
{
RARCH_ERR("Error occurred during D3DXCreateTextureFromFileExA().\n");
return false;
}
if(FAILED(ret))
{
RARCH_ERR("Error occurred during D3DXCreateTextureFromFileExA().\n");
return false;
}
// create a vertex buffer for the quad that will display the texture
// create a vertex buffer for the quad that will display the texture
ret = d3d->d3d_render_device->CreateVertexBuffer(4 * sizeof(DrawVerticeFormats),
D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &surface->m_pVertexBuffer);
if (FAILED(ret))
{
RARCH_ERR("Error occurred during CreateVertexBuffer().\n");
surface->m_pTexture->Release();
return false;
}
if (FAILED(ret))
{
RARCH_ERR("Error occurred during CreateVertexBuffer().\n");
surface->m_pTexture->Release();
return false;
}
return true;
return true;
}
void d3d_surface_free(d3d_surface_t *surface)
{
// free the vertex buffer
if (surface->m_pVertexBuffer)
{
surface->m_pVertexBuffer->Release();
surface->m_pVertexBuffer = NULL;
}
// free the vertex buffer
if (surface->m_pVertexBuffer)
{
surface->m_pVertexBuffer->Release();
surface->m_pVertexBuffer = NULL;
}
// free the texture
if (surface->m_pTexture)
{
surface->m_pTexture->Release();
surface->m_pTexture = NULL;
}
// free the texture
if (surface->m_pTexture)
{
surface->m_pTexture->Release();
surface->m_pTexture = NULL;
}
}
bool d3d_surface_render(d3d_surface_t *surface, int x, int y, int32_t w, int32_t h)
{
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;
if (surface->m_pTexture == NULL || surface->m_pVertexBuffer == NULL)
return false;
if (surface->m_pTexture == NULL || surface->m_pVertexBuffer == NULL)
return false;
float fX = static_cast<float>(x);
float fY = static_cast<float>(y);
float fX = static_cast<float>(x);
float fY = static_cast<float>(y);
// create the new vertices
DrawVerticeFormats newVerts[] =
{
// x, y, z, color, u ,v
{
// x, y, z, color, u ,v
{fX, fY, 0.0f, 0, 0, 0},
{fX + w, fY, 0.0f, 0, 1, 0},
{fX + w, fY + h, 0.0f, 0, 1, 1},
{fX, fY + h, 0.0f, 0, 0, 1}
};
};
// load the existing vertices
// load the existing vertices
DrawVerticeFormats *pCurVerts;
HRESULT ret = surface->m_pVertexBuffer->Lock(0, 0, (unsigned char**)&pCurVerts, 0);
HRESULT ret = surface->m_pVertexBuffer->Lock(0, 0, (unsigned char**)&pCurVerts, 0);
if (FAILED(ret))
{
RARCH_ERR("Error occurred during m_pVertexBuffer->Lock().\n");
return false;
}
if (FAILED(ret))
{
RARCH_ERR("Error occurred during m_pVertexBuffer->Lock().\n");
return false;
}
// copy the new verts over the old verts
memcpy(pCurVerts, newVerts, 4 * sizeof(DrawVerticeFormats));
// copy the new verts over the old verts
memcpy(pCurVerts, newVerts, 4 * sizeof(DrawVerticeFormats));
surface->m_pVertexBuffer->Unlock();
surface->m_pVertexBuffer->Unlock();
d3d->d3d_render_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
d3d->d3d_render_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
d3d->d3d_render_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
d3d->d3d_render_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
d3d->d3d_render_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
// also blend the texture with the set alpha value
d3d->d3d_render_device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
d3d->d3d_render_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
d3d->d3d_render_device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
// also blend the texture with the set alpha value
d3d->d3d_render_device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
d3d->d3d_render_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
d3d->d3d_render_device->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
// draw the quad
d3d->d3d_render_device->SetTexture(0, surface->m_pTexture);
d3d->d3d_render_device->SetStreamSource(0, surface->m_pVertexBuffer, sizeof(DrawVerticeFormats));
d3d->d3d_render_device->SetVertexShader(D3DFVF_CUSTOMVERTEX);
d3d->d3d_render_device->DrawPrimitive(D3DPT_QUADLIST, 0, 1);
// draw the quad
d3d->d3d_render_device->SetTexture(0, surface->m_pTexture);
d3d->d3d_render_device->SetStreamSource(0, surface->m_pVertexBuffer, sizeof(DrawVerticeFormats));
d3d->d3d_render_device->SetVertexShader(D3DFVF_CUSTOMVERTEX);
d3d->d3d_render_device->DrawPrimitive(D3DPT_QUADLIST, 0, 1);
return true;
return true;
}