⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commonhw.cpp

📁 PDE simulator on GPU.
💻 CPP
字号:
// CommonHW.cpp: implementation of the CCommon class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Shadow.h"
#include "CommonHW.h"
#include "FragmentProgram.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

LARGE_INTEGER startcounter, endcounter, frequency;
float        time_cost;

//////////////////////////////////////////////////////////////////////
//// Load in the fragment files before computations in detail.
//// NOTE:
//// But be sure it is called after OpenGL initialization and PBuffer 
//// initialization
//// Latest Date: 2003/12/3
//////////////////////////////////////////////////////////////////////
FragmentShaderID GlobeShaderID[50];
void LoadFragmentProgramFiles()
{
	int k=0;
	//////////////////////////////////////////////////////
	//strcpy(GlobeShaderID[CL_VECT_ADD_VECT_2D].FileName, "..\\add.fp");
	//strcpy(GlobeShaderID[CL_VECT_SUB_VECT_2D].FileName, "..\\sub.fp");
	//strcpy(GlobeShaderID[CL_VECT_MULT_VECT_2D].FileName, "..\\mul.fp");
	//strcpy(GlobeShaderID[CL_VECT_MAX_2D].FileName, "..\\max.fp");
	//strcpy(GlobeShaderID[CL_VECT_MIN_2D].FileName, "..\\min.fp");
	//strcpy(GlobeShaderID[CL_VECT_NORMAL_2D].FileName, "..\\normal.fp");
	//strcpy(GlobeShaderID[CL_DENSE_MAT_VECT_2D].FileName, "..\\matvector.fp");

	strcpy(GlobeShaderID[CL_VECT_ADD_VECT_RECT].FileName, "..\\addRECT.fp");
	strcpy(GlobeShaderID[CL_VECT_SUB_VECT_RECT].FileName, "..\\subRECT.fp");
	strcpy(GlobeShaderID[CL_VECT_MULT_VECT_RECT].FileName, "..\\mulRECT.fp");
	strcpy(GlobeShaderID[CL_VECT_MAX_RECT].FileName, "..\\maxRECT.fp");
	strcpy(GlobeShaderID[CL_VECT_MIN_RECT].FileName, "..\\minRECT.fp");
	strcpy(GlobeShaderID[CL_VECT_NORMAL_RECT].FileName, "..\\normalRECT.fp");
	strcpy(GlobeShaderID[CL_DENSE_MAT_VECT_RECT].FileName, "..\\matvectorRECT.fp");
	strcpy(GlobeShaderID[CL_MULTI_DENSE_MAT_VECT_RECT].FileName, "..\\matvectorRECTMulti.fp");
	strcpy(GlobeShaderID[CL_MULTI_DENSE_MAT_VECT_MULTITEX_RECT].FileName, "..\\matvectorRECTMultiMultiTex.fp");
	strcpy(GlobeShaderID[CL_MULTI_BOLZ_SPARSE_MAT_VECT].FileName, "..\\MultiBolzmatvectorRECT.fp");
	strcpy(GlobeShaderID[CL_MULTI_BOLZ_SPARSE_MAT_VECT_LAST].FileName, "..\\MultiBolzmatvectorRECTLast.fp");
	strcpy(GlobeShaderID[CL_BOLZ_SPARSE_MAT_VECT].FileName, "..\\BolzmatvectorRECT.fp");
	strcpy(GlobeShaderID[CL_BOLZ_SPARSE_MAT_VECT_LAST].FileName, "..\\BolzmatvectorRECTLast.fp");
	strcpy(GlobeShaderID[CL_BROOK_SPARSE_MAT_VECT].FileName, "..\\SDmatvectorRECT.fp");
	strcpy(GlobeShaderID[CL_MULTI_BROOK_SPARSE_MAT_VECT].FileName, "..\\MultiSDmatvectorRECT.fp");
	strcpy(GlobeShaderID[CL_KRUGER_SPARSE_MAT_VECT].FileName, "..\\ssmatrixvectorRECT.fp");
	strcpy(GlobeShaderID[CL_SORT_VECTOR_RECT].FileName, "..\\BitonicSortRECT.fp");
	
	int MaxShaderNum = 17;
	for(k=0;k<MaxShaderNum;k++)
		LoadFragmentProgramFromFile(GlobeShaderID[k].FileName, GlobeShaderID[k].ShaderID);

	return;
}


XMaxResourceStruct ResourceLimitOnCurrentHW;
void FindOutResourceLimitOnCurrentHW()
{
	//Max number of fragment program
	glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &(ResourceLimitOnCurrentHW.MaxTexUnitsNum));
	glGetIntegerv(GL_MAX_TEXTURE_COORDS_ARB , &(ResourceLimitOnCurrentHW.MaxTexCoordsNum));
	glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB , &(ResourceLimitOnCurrentHW.MaxTexImageUnitsNum));

	//Max number of vertex program
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxInstructionsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeInstructionsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxTemporariesNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeTemporariesNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxParametersNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeParametersNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxAttribsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxAttribsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxLocalParametersNum));

	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxEnvParametersNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxAluInstructionsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxTexInstructionsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxTexIndirectionsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeAluInstructionsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeTexInstructionsNum));
	glGetProgramivARB( GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.VertexProgram.MaxNativeTexIndirectionsNum));

	
	//Max number of fragment program
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxInstructionsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeInstructionsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxTemporariesNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeTemporariesNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxParametersNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeParametersNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxAttribsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxAttribsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxLocalParametersNum));

	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxEnvParametersNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxAluInstructionsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxTexInstructionsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxTexIndirectionsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeAluInstructionsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeTexInstructionsNum));
	glGetProgramivARB( GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB, &(ResourceLimitOnCurrentHW.FragmentProgram.MaxNativeTexIndirectionsNum));

	
	return;
}

/////////////////////////////////////////////////////////////////////
// determine the basic number of pow of 2
//  for example, pow(n, 2) = x;
/////////////////////////////////////////////////////////////////////
int PowOf2(int x)
{
	int n=0;
	while(x>1)
	{
		x = x>>1;
		n++;
	}
	return n;
}
//////////////////////////////////////////////////////////////////////
// x^2 >= TotalSize && x = 2^n
//////////////////////////////////////////////////////////////////////
int CalTexSize(const int TotalSize)
{
	return (int)pow(2,ceil(log10(TotalSize)/log10(4)));
}

//////////////////////////////////////////////////////////////////////
/// One Dim -----> Two Dim
/// To find Optimized Texture Height & Width to min reduction
//////////////////////////////////////////////////////////////////////
void CalOptTexRSize(const int TotalSize, int& Height, int& Width)
{
	Height = floor(sqrt(TotalSize));
	Width  = ceil((double)TotalSize/(double)Height);
	return;
}

//////////////////////////////////////////////////////////////////////
/// One Dim -----> Two Dim
/// To find Optimized Texture Height & Width to min reduction
//////////////////////////////////////////////////////////////////////
void CalOptTexRGBASize(const int TotalSize, int& Height, int& Width)
{
	int size = ceil((double)TotalSize/4);
	Height = floor(sqrt(size));
	Width  = ceil((double)size/(double)Height);
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -