Jump to content
  • Advertisement
Sign in to follow this  
d h k

[D3D9] LPD3DXEFFECT trouble, simple access results in crash [SOLVED]

This topic is 3029 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have a structure for my shaders:
class Shader
{
	private:
		bool CreateFromString ( IDirect3DDevice9 *device, std::string shader_code );

	public:
		LPD3DXEFFECT effect; // pointer to an ID3DXEffect (using ID3DXEffect *effect doesn't make a diff BTW)

		bool CreateFromFile ( IDirect3DDevice9 *device, std::string filename );
		bool CreateDefaultShader ( IDirect3DDevice9 *device );
		bool CreateNullShader ( IDirect3DDevice9 *device );
};




Take a look at the implementation of CreateFromFile:
bool Shader::CreateFromFile ( IDirect3DDevice9 *device, std::string filename )
// creates a shader from an external file
{
	ID3DXBuffer *error_buffer = NULL;

	if ( FAILED ( D3DXCreateEffectFromFileA ( device, filename.c_str ( ), NULL, NULL, SHADER_COMPILE_FLAGS, NULL, &effect, &error_buffer ) ) )
	{
		std::stringstream s;
		s << "Failed to compile effect..." << std::endl << std::endl;
		s << "The following error(s) were encountered during compilation of '" << filename.c_str ( ) << "':" << std::endl << std::endl;
		s << ( const char *) error_buffer->GetBufferPointer ( ) << std::endl << std::endl;
		s << "Hit Ctrl+C to copy this message to the clipboard, then paste it when you report this error...";
		Error ( s.str ( ) );
		return false;
	}

	if ( !effect )
	{
		std::stringstream s;
		s << "Failed to create effect from file '" << filename.c_str ( ) << "'...";
		Error ( s.str ( ) );
		return false;
	}

	if ( FAILED ( effect->SetTechnique ( "EntryPoint" ) ) )
	// select technique
	{
		std::stringstream s;
		s << "Failed to set technique for effect '" << filename.c_str ( ) << "'...";
		Error ( s.str ( ) );
		return false;
	}

	return true;
}




Should be straight-forward. However, I discovered that the above function crashes whenever I even try to access the shader::effect member. The first call (to D3DXCreateEffectFromFileA) actually runs fine (doesn't FAIL or crash) but the line below (if ( !effect )) crashes. When I add even something like "effect = NULL;" as the first line in the function, it crashes there. I'm not exactly sure what could be causing this to be honest. What DOES work is when I define the effect member as a simple local variable in the function. This won't crash (but is obviously not what I'm looking for). Any ideas? [Edited by - d h k on April 3, 2010 7:59:14 PM]

Share this post


Link to post
Share on other sites
Advertisement
What's the "crash" you're getting? The exception code and information should tell you some specifics of the problem.

Also if you're calling CreateFromFile on a pointer to a Shader, make sure that pointer is valid (and not NULL, or uninitialized).

Share this post


Link to post
Share on other sites
Wow, yeah that was it. Really embarrassing mistake to make... :p I actually had a system for the user to create custom shaders defined in the engine but forgot I didn't have it implemented so my std::vector<Shader*> had invalid Shader instances in it which caused the "weird" behavior.

Thanks a ton, I think I'm slightly wiser now. :D

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!