Честно говоря, я не знаю, почему вы захотите это сделать. Это звучит как действительно ужасная идея по разным причинам, поэтому, пожалуйста, расскажите нам, почему вы хотите сделать это, чтобы мы могли убедить вас не делать этого;).
Между тем, краткий обзор того, как вы это сделаете:
IDirect3DTexture9* pTex = NULL;
HRESULT hr = S_OK;
hr = m_d3dDevice->CreateTexture(
surface->w,
surface->h,
1,
usage,
format,
D3DPOOL_MANAGED,
&pTex,
NULL);
Это создает фактическую текстуру с размером и форматом SDL_Surface. Вы должны будете заполнить использование самостоятельно, в зависимости от того, как вы хотите его использовать (см. D3DUSAGE). Вам также придется выяснить формат самостоятельно - вы не можете напрямую отобразить SDL_PixelFormat на D3DFORMAT. Это будет непросто, если вы точно не знаете, в каком формате пикселей используется SDL_Surface.
Теперь вам нужно записать данные в текстуру. Вы не можете использовать прямую memcpy здесь, так как SDL_Surface и фактическая текстура могут иметь разные шаги. Вот некоторый непроверенный код, который может сделать это для вас:
HRESULT hr;
D3DLOCKED_RECT lockedRect;
// lock the texture, so that we can write into it
// Note: if you used D3DUSAGE_DYNAMIC above, you should
// use D3DLOCK_DISCARD as the flags parameter instead of 0.
hr = pTex->LockRect(0, &lockedRect, NULL, 0);
if(SUCCEEDED(hr))
{
// use char pointers here for byte indexing
char* src = (char*) surface->pixels;
char* dst = (char*) lockedRect->pBits;
size_t numRows = surface->h;
size_t rowSize = surface->w * surface->format->BytesPerPixel;
// for each row...
while(numRows--)
{
// copy the row
memcpy(dst, src, rowSize);
// use the given pitch parameters to advance to the next
// row (since these may not equal rowSize)
src += surface->pitch;
dst += lockedRect->Pitch;
}
// don't forget this, or D3D won't like you ;)
hr = pTex->UnlockRect(0);
}