Skip to main content
gamedev.net
🔒 Locked

HLSL constant table problem

Started by Woodchuck 0 replies 2.3k views
Original Post
Woodchuck
Woodchuck
Hello, I've got a problem with the JUN 2005 SDK Update that i haven't with the SUMMER 2004 one. I compile shader from file (.fx) and want to use the constant table of a vertex shader to set a matrix. My problem is that the handle return by GetConstantByName is NULL. Here is the code of shader compilation :

void JOYFX_Init(LPDIRECT3DDEVICE9 d3ddevice,char fx_name[], s_JOYFx &fx)
{
	DWORD dwShaderFlags = 0;
	LPD3DXBUFFER pCode   = NULL;
    LPD3DXBUFFER pErrors = NULL;
	HRESULT hr;
	char name[200];
	HANDLE hFile, hMap;	
	DWORD* dwpVS;

	strcpy(name,JOYFXPATH);
	strcat(name,fx_name);
	strcat(name,".fx");

	fx.isinitiate = false;

	hr = D3DXCompileShaderFromFile(name,NULL,NULL,"VS",/*D3DXGetVertexShaderProfile(d3ddevice)*/"vs_2_a",dwShaderFlags,&pCode,&pErrors,&fx.fx_vconstants);
	if(FAILED(hr))
	{
		LOG_Writenl("D3DXCompileShaderFromFile failled : fx.");
		LOG_Writenl((char*)pErrors->GetBufferPointer());
		pErrors->Release();
			
		strcpy(name,JOYFXPATH);
		strcat(name,fx_name);
		strcat(name,".vso");
		
		hFile = CreateFile(name, GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

		if(hFile != INVALID_HANDLE_VALUE) 
		{
			if(GetFileSize(hFile,0) > 0) 
				hMap = CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);
			else
			{
				CloseHandle(hFile);
				return;		
			}
		}	
		else
		{
			return;	
		}
		
		dwpVS = (DWORD *)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);

		hr = d3ddevice->CreateVertexShader(dwpVS,&fx.fx_vshader);
		if(FAILED(hr))
		{
			CloseHandle(hFile);
			LOG_Writenl("CreateVertexShader failled : fx.");
			LOG_Writenl(name);
			return;
		}

		unsigned char *function;
		unsigned int size;

		fx.fx_vshader->GetFunction(NULL,&size);
		function = new unsigned char[size];
		fx.fx_vshader->GetFunction(function,&size);
		hr = D3DXGetShaderConstantTable((DWORD*)function,&fx.fx_vconstants);
		if(FAILED(hr))
		{
			delete [] function;
			CloseHandle(hFile);
			LOG_Write("D3DXGetShaderConstantTable failled : fx.");
			LOG_Writenl(name);
			return;
		}
		delete [] function;

		CloseHandle(hFile);
	}
	else
	{
		hr = d3ddevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(),&fx.fx_vshader);
		if(FAILED(hr))
		{
			LOG_Writenl("D3DXCompileShaderFromFile failled : fx.");
			LOG_Writenl((char*)pErrors->GetBufferPointer());
			pErrors->Release();

			return;
		}
		pCode->Release();
	}

	strcpy(name,JOYFXPATH);
	strcat(name,fx_name);
	strcat(name,".fx");

	hr = D3DXCompileShaderFromFile(name,NULL,NULL,"PS",/*D3DXGetPixelShaderProfile(d3ddevice)*/"ps_2_b",dwShaderFlags,&pCode,&pErrors,&fx.fx_pconstants);
	if(FAILED(hr))
	{
		LOG_Write("D3DXCompileShaderFromFile failled : ");LOG_Write(name);LOG_Writenl(".");
		LOG_Writenl((char*)pErrors->GetBufferPointer());
		pErrors->Release();

		strcpy(name,JOYFXPATH);
		strcat(name,fx_name);
		strcat(name,".pso");

		hFile = CreateFile(name, GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
		if(hFile != INVALID_HANDLE_VALUE) 
		{
			if(GetFileSize(hFile,0) > 0) 
				hMap = CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);
			else
			{
				CloseHandle(hFile);
				return;		
			}
		}	
		else
		{
			return;	
		}

		dwpVS = (DWORD *)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);

		hr = d3ddevice->CreatePixelShader(dwpVS,&fx.fx_pshader);
		if(FAILED(hr))
		{
			CloseHandle(hFile);
			LOG_Writenl("CreatePixelShader failled : fx.");
			LOG_Writenl(name);
			return;
		}

		unsigned char *function;
		unsigned int size;

		fx.fx_pshader->GetFunction(NULL,&size);
		function = new unsigned char[size];
		fx.fx_pshader->GetFunction(function,&size);
		hr = D3DXGetShaderConstantTable((DWORD*)function,&fx.fx_pconstants);
		if(FAILED(hr))
		{
			delete [] function;
			CloseHandle(hFile);
			LOG_Write("D3DXGetShaderConstantTable failled : fx.");
			LOG_Writenl(name);
			return;
		}
		delete [] function;

		CloseHandle(hFile);
	}
	else
	{
		hr = d3ddevice->CreatePixelShader((DWORD*)pCode->GetBufferPointer(),&fx.fx_pshader);
		if(FAILED(hr))
		{
			LOG_Writenl("CreatePixelShader failled : ");LOG_Write(name);LOG_Writenl(".");
			LOG_Writenl((char*)pErrors->GetBufferPointer());
			pErrors->Release();

			return;
		}
		pCode->Release();
	}

	fx.isinitiate = true;
}
and the matrix setting one :

handle = fx_morphlet.fx_vconstants->GetConstantByName(NULL,("scale_matrix"));
		if(handle)hr = fx_morphlet.fx_vconstants->SetMatrix(lp_d3ddevice,handle,&mat);
		else LOG_Writenl((int)handle);
It really works with the summer 2004 sdk update and not with the jun 2005 one. Note that there is no error returned by the JOYFX_Init() function. Any help is welcome Thanks Chuck
Woodchuck
Woodchuck
Ok, DX9 SDK Update are STAND ALONE ! This bug was du to a conflict 'cause i kept the "Complete" SDK installed...

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.