static __forceinline void* AllocateContiguousMemory( DWORD Size, DWORD Alignment, DWORD Protection = XALLOC_MEMPROTECT_WRITECOMBINE ) { #if defined(_XBOX1) return D3D_AllocContiguousMemory(Size, Alignment); #elif defined(_XBOX360) return XMemAlloc( Size, MAKE_XALLOC_ATTRIBUTES( 0, 0, 0, 0, eXALLOCAllocatorId_AtgResource, Alignment, Protection, 0, XALLOC_MEMTYPE_PHYSICAL ) ); #endif }
bool CRGBRenderer::Create444PTexture() { CSingleLock lock(g_graphicsContext); if (!m_444PTexture[FIELD_FULL]) { unsigned stride = ALIGN(m_iSourceWidth<<2,D3DTEXTURE_ALIGNMENT); void* data = D3D_AllocContiguousMemory( stride*m_iSourceHeight, D3DTEXTURE_ALIGNMENT ); for(int f=0;f<MAX_FIELDS;f++) { m_444PTexture[f] = new D3DTexture(); m_444PTexture[f]->AddRef(); } XGSetTextureHeader(m_iSourceWidth, m_iSourceHeight, 1, 0, D3DFMT_LIN_A8R8G8B8, 0, m_444PTexture[0], 0, stride); XGSetTextureHeader(m_iSourceWidth, m_iSourceHeight>>1, 1, 0, D3DFMT_LIN_A8R8G8B8, 0, m_444PTexture[1], 0, stride<<1); XGSetTextureHeader(m_iSourceWidth, m_iSourceHeight>>1, 1, 0, D3DFMT_LIN_A8R8G8B8, 0, m_444PTexture[2], stride, stride<<1); for(int f=0;f<MAX_FIELDS;f++) m_444PTexture[f]->Register(data); CLog::Log(LOGINFO, "Created 444P texture"); }
//----------------------------------------------------------------------------- // Name: LoadPackedResource() // Desc: Loads all the texture resources from the given XPR. //----------------------------------------------------------------------------- HRESULT RenderingManagerC::LoadPackedResource() { // Open the file to read the XPR headers FILE* file = fopen( "D:\\Media\\Resource.xpr", "rb" ); if( NULL == file ) return E_FAIL; // Read in and verify the XPR magic header XPR_HEADER xprh; if( fread( &xprh, sizeof(XPR_HEADER), 1, file ) != 1 ) { fclose(file); return E_FAIL; } if( xprh.dwMagic != XPR_MAGIC_VALUE ) { OutputDebugStringA( "ERROR: Invalid Xbox Packed Resource (.xpr) file" ); fclose( file ); return E_INVALIDARG; } // Compute memory requirements DWORD dwSysMemDataSize = xprh.dwHeaderSize - sizeof(XPR_HEADER); DWORD dwVidMemDataSize = xprh.dwTotalSize - xprh.dwHeaderSize; // Allocate memory g_pResourceSysMemData = new BYTE[dwSysMemDataSize]; g_pResourceVidMemData = (BYTE*)D3D_AllocContiguousMemory( dwVidMemDataSize, D3DTEXTURE_ALIGNMENT ); // Read in the data from the file if( fread( g_pResourceSysMemData, dwSysMemDataSize, 1, file ) != 1 || fread( g_pResourceVidMemData, dwVidMemDataSize, 1, file ) != 1 ) { delete[] g_pResourceSysMemData; D3D_FreeContiguousMemory( g_pResourceVidMemData ); fclose( file ); return E_FAIL; } // Done with the file fclose( file ); // Loop over resources, calling Register() BYTE* pData = g_pResourceSysMemData; for( DWORD i = 0; i < resource_NUM_RESOURCES; i++ ) { // Get the resource LPDIRECT3DRESOURCE8 pResource = (LPDIRECT3DRESOURCE8)pData; // Register the resource pResource->Register( g_pResourceVidMemData ); // Advance the pointer switch( pResource->GetType() ) { case D3DRTYPE_TEXTURE: pData += sizeof(D3DTexture); break; case D3DRTYPE_VOLUMETEXTURE: pData += sizeof(D3DVolumeTexture); break; case D3DRTYPE_CUBETEXTURE: pData += sizeof(D3DCubeTexture); break; case D3DRTYPE_VERTEXBUFFER: pData += sizeof(D3DVertexBuffer); break; case D3DRTYPE_INDEXBUFFER: pData += sizeof(D3DIndexBuffer); break; case D3DRTYPE_PALETTE: pData += sizeof(D3DPalette); break; default: return E_FAIL; } } return S_OK; }
//----------------------------------------------------------------------------- // Name: Create() // Desc: Loads all the texture resources from the given XPR. //----------------------------------------------------------------------------- HRESULT CXBPackedResource::Create( LPDIRECT3DDEVICE8 pd3dDevice, const CHAR* strFilename, DWORD dwNumResources, XBRESOURCE* pResourceTags ) { // Find the media file CHAR strResourcePath[512]; if( FAILED( XBUtil_FindMediaFile( strResourcePath, strFilename ) ) ) return E_FAIL; // Open the file HANDLE hFile; DWORD dwNumBytesRead; hFile = CreateFile(strResourcePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if(hFile == INVALID_HANDLE_VALUE) { OUTPUT_DEBUG_STRING( "CXBPackedResource::Create(): ERROR: File not found!\n" ); return E_FAIL; } // Read in and verify the XPR magic header XPR_HEADER xprh; ReadFile(hFile, &xprh, sizeof(XPR_HEADER), &dwNumBytesRead, NULL); if( xprh.dwMagic != XPR_MAGIC_VALUE ) { OUTPUT_DEBUG_STRING( "Invalid Xbox Packed Resource (.xpr) file" ); return E_INVALIDARG; } // Compute memory requirements DWORD dwSysMemDataSize = xprh.dwHeaderSize - sizeof(XPR_HEADER); DWORD dwVidMemDataSize = xprh.dwTotalSize - xprh.dwHeaderSize; // Allocate memory m_pSysMemData = new BYTE[dwSysMemDataSize]; m_pVidMemData = (BYTE*)D3D_AllocContiguousMemory( dwVidMemDataSize, D3DTEXTURE_ALIGNMENT ); // Read in the data from the file ReadFile(hFile, m_pSysMemData, dwSysMemDataSize, &dwNumBytesRead, NULL); ReadFile(hFile, m_pVidMemData, dwVidMemDataSize, &dwNumBytesRead, NULL); // Done with the file CloseHandle(hFile); // Loop over resources, calling Register() BYTE* pData = m_pSysMemData; for( DWORD i = 0; i < dwNumResources; i++ ) { // Check for user data if( *((DWORD*)pData) & 0x80000000 ) { DWORD dwType = ((DWORD*)pData)[0]; DWORD dwSize = ((DWORD*)pData)[1]; pData += sizeof(DWORD) * 2; (VOID)dwType; // not used pData += dwSize; } else { // Get the resource LPDIRECT3DRESOURCE8 pResource = (LPDIRECT3DRESOURCE8)pData; // Register the resource pResource->Register( m_pVidMemData ); // Advance the pointer pData += XBResource_SizeOf( pResource ); } } // Finally, store number of resources and the resource tags m_dwNumResources = dwNumResources; m_pResourceTags = pResourceTags; return S_OK; }