Sign in to follow this  
_Sauce_

Rendering array of pixels directly to backbuffer (DX9)

Recommended Posts

_Sauce_    116
I'm trying to render an array of pixels to the backbuffer in directx9 and I'm having a bit of trouble. Here's what I've tried so far:
IDirect3DSurface9 *d3dSurface = NULL;
RECT rect = {0, 0, mWidth, mHeight};

HRESULT hr = D3DXLoadSurfaceFromMemory(d3dSurface, NULL, NULL, mPixels, D3DFMT_R8G8B8, mWidth * sizeof(TrueColorPixel), NULL, &rect, D3DX_DEFAULT, 0);
	
if(FAILED(hr))
{
	DXTrace(__FILE__, __LINE__, hr, _T(__FUNCTION__), TRUE);
}

pDevice->BeginScene();

IDirect3DSurface9 *backBuffer = NULL;

if(SUCCEEDED(pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer)))
{
	pDevice->StretchRect(d3dSurface, NULL, backBuffer, &rect, D3DTEXF_NONE);
}

pDevice->EndScene();

if(d3dSurface)
{
	d3dSurface->Release();
	d3dSurface = NULL;
}

However whenever I run this I get "D3DERR_INVALID_CALL" for D3DXLoadSurfaceFromMemory() - what am I missing here?

Share this post


Link to post
Share on other sites
_Sauce_    116
Yep, I ended up trying IDirect3DDevice9::CreateOffscreenPlainSurface() which worked - I then turned on the debug runtimes and found it didn't like the pixel format, so I changed that to X8R8G8B8 - but now it tells me I'm passing an invalid rect in IDirect3DDevice9::StretchRect() :(

Looking back at my code though, it seems I'm grossly over-complicating the issue - does GetBackBuffer() return the actual backbuffer that I can modify, or does it give me a copy of it?

Share this post


Link to post
Share on other sites
mikfig    114
I looked at the documentation for the GetBackBuffer function.

In the remarks it says this:

Calling this method will increase the internal reference count on the IDirect3DSurface9 interface.

So it looks to me that it gives you a pointer to the actual back buffer surface.

Share this post


Link to post
Share on other sites
_Sauce_    116
Okay, so it turns out I really was overcomplicating things (not to mention, forgetting to call present() *facepalm*

pDevice->BeginScene();

IDirect3DSurface9 *backBuffer = NULL;
if(SUCCEEDED(pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer)))
{
RECT rect = {0, 0, mWidth, mHeight};
D3DXLoadSurfaceFromMemory(backBuffer, NULL, NULL, mPixels, D3DFMT_X8R8G8B8,
mWidth * sizeof(TrueColorPixel), NULL, &rect, D3DX_DEFAULT, 0);
}

pDevice->EndScene();

pDevice->Present(NULL, NULL, NULL, NULL);

if(backBuffer)
{
backBuffer->Release();
backBuffer = NULL;
}


works smashingly :)

Share this post


Link to post
Share on other sites
Evil Steve    2017
Quote:
Original post by Martin
I wonder how this compares to drawing a number of textures....
It's probably slower, YMMV.

Also, the Debug Runtimes will tell you why something has gone wrong when a D3D function fails, which is extremely useful in debugging.

Share this post


Link to post
Share on other sites
_Sauce_    116
Quote:
Original post by _Sauce_
Yep, I ended up trying IDirect3DDevice9::CreateOffscreenPlainSurface() which worked - I then turned on the debug runtimes and found it didn't like the pixel format, so I changed that to X8R8G8B8


:)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this