static boost::uint32_t GetCpuCoreForWorkerThread(int index, boost::uint32_t availCores, boost::uint32_t avoidCores) { boost::uint32_t ompCore = 1; // find an unused core { while ((ompCore) && !(ompCore & availCores)) ompCore <<= 1; int n = index; // select n'th bit in availCores while (n--) do ompCore <<= 1; while ((ompCore) && !(ompCore & availCores)); } // select one of the mainthread cores if none found if (ompCore == 0) { /*int cntBits =*/ count_bits_set(avoidCores); ompCore = 1; while ((ompCore) && !(ompCore & avoidCores)) ompCore <<= 1; int n = index; // select n'th bit in avoidCores while (n--) do ompCore <<= 1; while ((ompCore) && !(ompCore & avoidCores)); } // fallback use all if (ompCore == 0) { ompCore = ~0; } return ompCore; }
static boost::uint32_t GetCpuCoreForWorkerThread(int index, boost::uint32_t availCores, boost::uint32_t avoidCores) { boost::uint32_t ompCore = 1; // find an unused core // count down cause hyperthread cores are appended to the end and we prefer those for our worker threads // (the physical cores are prefered for task specific threads) { while ((ompCore) && !(ompCore & availCores)) ompCore <<= 1; int n = index; // select n'th bit in availCores while (n--) do ompCore <<= 1; while ((ompCore) && !(ompCore & availCores)); } // select one of the mainthread cores if none found if (ompCore == 0) { /*int cntBits =*/ count_bits_set(avoidCores); ompCore = 1; while ((ompCore) && !(ompCore & avoidCores)) ompCore <<= 1; int n = index; // select n'th bit in avoidCores while (n--) do ompCore <<= 1; while ((ompCore) && !(ompCore & avoidCores)); } // fallback use all if (ompCore == 0) { ompCore = ~0; } return ompCore; }
int random_sleep_bit(int millis) { long start = ts_nanos(); usleep(millis); long xor = start ^ ts_nanos(); int set = count_bits_set(xor); return set&1; }
int main(int argc, char **argv) { uint32_t x; printf("Enter number in hex: "); scanf("%x", &x); printf("Number of bits set in %#X = %d\n", x, count_bits_set(x)); return 0; }
/* #define W_SIZE 4 #define WF_SIZE 4096 #define WH_SIZE 2048 */ CDynWater::CDynWater(void) { if (!FBO::IsSupported()) throw content_error("DynWater Error: missing FBO support"); lastWaveFrame=0; noWakeProjectiles=true; firstDraw=true; drawSolid=true; camPosBig=float3(2048,0,2048); refractSize=gu->viewSizeY>=1024 ? 1024:512; glGenTextures(1, &reflectTexture); glBindTexture(GL_TEXTURE_2D, reflectTexture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8 ,512, 512, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0); glGenTextures(1, &refractTexture); glBindTexture(GL_TEXTURE_2D, refractTexture); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8 ,refractSize, refractSize, 0,GL_RGBA, GL_UNSIGNED_BYTE, 0); glGenTextures(1, &detailNormalTex); glBindTexture(GL_TEXTURE_2D, detailNormalTex); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,256, 256, 0,GL_RGBA, GL_FLOAT, 0); glGenerateMipmapEXT(GL_TEXTURE_2D); float* temp=new float[1024*1024*4]; for(int y=0;y<64;++y){ for(int x=0;x<64;++x){ temp[(y*64+x)*4+0]=(sin(x*PI*2.0f/64.0f)) + (x<32 ? -1:1)*0.3f; temp[(y*64+x)*4+1]=temp[(y*64+x)*4+0]; temp[(y*64+x)*4+2]=(cos(x*PI*2.0f/64.0f)) + (x<32 ? 16-x:x-48)/16.0f*0.3f; temp[(y*64+x)*4+3]=0; } } glGenTextures(3, rawBumpTexture); glBindTexture(GL_TEXTURE_2D, rawBumpTexture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,64, 64, 0,GL_RGBA, GL_FLOAT, temp); CBitmap foam; if (!foam.Load(mapInfo->water.foamTexture)) throw content_error("Could not load foam from file " + mapInfo->water.foamTexture); if (count_bits_set(foam.xsize)!=1 || count_bits_set(foam.ysize)!=1) throw content_error("Foam texture not power of two!"); unsigned char* scrap=new unsigned char[foam.xsize*foam.ysize*4]; for(int a=0;a<foam.xsize*foam.ysize;++a) scrap[a]=foam.mem[a*4]; glGenTextures(1, &foamTex); glBindTexture(GL_TEXTURE_2D, foamTex); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glBuildMipmaps(GL_TEXTURE_2D, GL_LUMINANCE,foam.xsize,foam.ysize, GL_LUMINANCE, GL_UNSIGNED_BYTE, scrap); delete[] scrap; if(ProgramStringIsNative(GL_VERTEX_PROGRAM_ARB,"waterDyn.vp")) waterVP=LoadVertexProgram("waterDyn.vp"); else waterVP=LoadVertexProgram("waterDynNT.vp"); waterFP=LoadFragmentProgram("waterDyn.fp"); waveFP=LoadFragmentProgram("waterDynWave.fp"); waveVP=LoadVertexProgram("waterDynWave.vp"); waveFP2=LoadFragmentProgram("waterDynWave2.fp"); waveVP2=LoadVertexProgram("waterDynWave2.vp"); waveNormalFP=LoadFragmentProgram("waterDynNormal.fp"); waveNormalVP=LoadVertexProgram("waterDynNormal.vp"); waveCopyHeightFP=LoadFragmentProgram("waterDynWave3.fp"); waveCopyHeightVP=LoadVertexProgram("waterDynWave3.vp"); dwGroundRefractVP=LoadVertexProgram("dwgroundrefract.vp"); dwGroundReflectIVP=LoadVertexProgram("dwgroundreflectinverted.vp"); dwDetailNormalFP=LoadFragmentProgram("dwDetailNormal.fp"); dwDetailNormalVP=LoadVertexProgram("dwDetailNormal.vp"); dwAddSplashFP=LoadFragmentProgram("dwAddSplash.fp"); dwAddSplashVP=LoadVertexProgram("dwAddSplash.vp"); waterSurfaceColor = mapInfo->water.surfaceColor; for(int y=0;y<1024;++y){ for(int x=0;x<1024;++x){ temp[(y*1024+x)*4+0]=0; temp[(y*1024+x)*4+1]=0; temp[(y*1024+x)*4+2]=0; temp[(y*1024+x)*4+3]=0; } } glGenTextures(1, &waveHeight32); glBindTexture(GL_TEXTURE_2D, waveHeight32); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F_ARB ,256, 256, 0,GL_RGBA, GL_FLOAT, temp); glGenTextures(1, &waveTex1); glBindTexture(GL_TEXTURE_2D, waveTex1); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,1024, 1024, 0,GL_RGBA, GL_FLOAT, temp); for(int y=0;y<1024;++y){ for(int x=0;x<1024;++x){ //float dist=(x-500)*(x-500)+(y-450)*(y-450); temp[(y*1024+x)*4+0]=0;//max(0.0f,15-sqrt(dist));//sin(y*PI*2.0f/64.0f)*0.5f+0.5f; temp[(y*1024+x)*4+1]=0; temp[(y*1024+x)*4+2]=0; temp[(y*1024+x)*4+3]=0; } } glGenTextures(1, &waveTex2); glBindTexture(GL_TEXTURE_2D, waveTex2); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,1024, 1024, 0,GL_RGBA, GL_FLOAT, temp); for(int y=0;y<1024;++y){ for(int x=0;x<1024;++x){ temp[(y*1024+x)*4+0]=0; temp[(y*1024+x)*4+1]=1; temp[(y*1024+x)*4+2]=0; temp[(y*1024+x)*4+3]=0; } } glGenTextures(1, &waveTex3); glBindTexture(GL_TEXTURE_2D, waveTex3); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,1024, 1024, 0,GL_RGBA, GL_FLOAT, temp); for(int y=0;y<64;++y){ float dy=y-31.5f; for(int x=0;x<64;++x){ float dx=x-31.5f; float dist=sqrt(dx*dx+dy*dy); temp[(y*64+x)*4+0]=std::max(0.0f,1-dist/30.f)*std::max(0.0f,1-dist/30.f); temp[(y*64+x)*4+1]=std::max(0.0f,1-dist/30.f); temp[(y*64+x)*4+2]=std::max(0.0f,1-dist/30.f)*std::max(0.0f,1-dist/30.f); temp[(y*64+x)*4+3]=0; } } glGenTextures(1, &splashTex); glBindTexture(GL_TEXTURE_2D, splashTex); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR/*_MIPMAP_NEAREST*/); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); //gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA32F_ARB ,64, 64, GL_RGBA, GL_FLOAT, temp); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA16F_ARB ,64, 64, 0,GL_RGBA, GL_FLOAT, temp); unsigned char temp2[]={0,0,0,0}; glGenTextures(1, &zeroTex); glBindTexture(GL_TEXTURE_2D, zeroTex); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR/*_MIPMAP_NEAREST*/); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8 ,1, 1, 0,GL_RGBA, GL_UNSIGNED_BYTE, temp2); unsigned char temp3[]={0,255,0,0}; glGenTextures(1, &fixedUpTex); glBindTexture(GL_TEXTURE_2D, fixedUpTex); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR/*_MIPMAP_NEAREST*/); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8 ,1, 1, 0,GL_RGBA, GL_UNSIGNED_BYTE, temp3); CBitmap bm; if (!bm.Load("bitmaps/boatshape.bmp")) throw content_error("Could not load boatshape from file bitmaps/boatshape.bmp"); for(int a=0;a<bm.xsize*bm.ysize;++a){ bm.mem[a*4+2]=bm.mem[a*4]; bm.mem[a*4+3]=bm.mem[a*4]; } boatShape=bm.CreateTexture(); CBitmap bm2; if (!bm.Load("bitmaps/hovershape.bmp")) throw content_error("Could not load hovershape from file bitmaps/hovershape.bmp"); for(int a=0;a<bm2.xsize*bm2.ysize;++a){ bm2.mem[a*4+2]=bm2.mem[a*4]; bm2.mem[a*4+3]=bm2.mem[a*4]; } hoverShape=bm2.CreateTexture(); delete[] temp; glGenFramebuffersEXT(1,&frameBuffer); reflectFBO.Bind(); reflectFBO.AttachTexture(reflectTexture, GL_TEXTURE_2D, GL_COLOR_ATTACHMENT0_EXT); reflectFBO.CreateRenderBuffer(GL_DEPTH_ATTACHMENT_EXT, GL_DEPTH_COMPONENT32, 512, 512); refractFBO.Bind(); refractFBO.AttachTexture(refractTexture, GL_TEXTURE_2D, GL_COLOR_ATTACHMENT0_EXT); refractFBO.CreateRenderBuffer(GL_DEPTH_ATTACHMENT_EXT, GL_DEPTH_COMPONENT32, refractSize, refractSize); FBO::Unbind(); if (!reflectFBO.IsValid() || !refractFBO.IsValid()) throw content_error("DynWater Error: Invalid FBO"); }
bool CNamedTextures::Load(const string& texName, GLuint texID) { //! strip off the qualifiers string filename = texName; bool border = false; bool clamped = false; bool nearest = false; bool linear = false; bool aniso = false; bool invert = false; bool greyed = false; bool tint = false; float tintColor[3]; bool resize = false; int2 resizeDimensions; if (filename[0] == ':') { int p; for (p = 1; p < (int)filename.size(); p++) { const char ch = filename[p]; if (ch == ':') { break; } else if (ch == 'n') { nearest = true; } else if (ch == 'l') { linear = true; } else if (ch == 'a') { aniso = true; } else if (ch == 'i') { invert = true; } else if (ch == 'g') { greyed = true; } else if (ch == 'c') { clamped = true; } else if (ch == 'b') { border = true; } else if (ch == 't') { const char* cstr = filename.c_str() + p + 1; const char* start = cstr; char* endptr; tintColor[0] = (float)strtod(start, &endptr); if ((start != endptr) && (*endptr == ',')) { start = endptr + 1; tintColor[1] = (float)strtod(start, &endptr); if ((start != endptr) && (*endptr == ',')) { start = endptr + 1; tintColor[2] = (float)strtod(start, &endptr); if (start != endptr) { tint = true; p += (endptr - cstr); } } } } else if (ch == 'r') { const char* cstr = filename.c_str() + p + 1; const char* start = cstr; char* endptr; resizeDimensions.x = (int)strtoul(start, &endptr, 10); if ((start != endptr) && (*endptr == ',')) { start = endptr + 1; resizeDimensions.y = (int)strtoul(start, &endptr, 10); if (start != endptr) { resize = true; p += (endptr - cstr); } } } } if (p < (int)filename.size()) { filename = filename.substr(p + 1); } else { filename.clear(); } } //! get the image CBitmap bitmap; TexInfo texInfo; if (!bitmap.Load(filename)) { texMap[texName] = texInfo; glBindTexture(GL_TEXTURE_2D, 0); return false; } if (bitmap.type == CBitmap::BitmapTypeDDS) { texID = bitmap.CreateDDSTexture(texID); } else { if (resize) { bitmap = bitmap.CreateRescaled(resizeDimensions.x,resizeDimensions.y); } if (invert) { bitmap.InvertColors(); } if (greyed) { bitmap.GrayScale(); } if (tint) { bitmap.Tint(tintColor); } //! make the texture glBindTexture(GL_TEXTURE_2D, texID); if (clamped) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); } if (nearest || linear) { if (border) { GLfloat white[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, white); } if (nearest) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } else { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } //! Note: NPOTs + nearest filtering seems broken on ATIs if ( !(count_bits_set(bitmap.xsize)==1 && count_bits_set(bitmap.ysize)==1) && (!GLEW_ARB_texture_non_power_of_two || (gu->atiHacks && nearest)) ) { bitmap = bitmap.CreateRescaled(next_power_of_2(bitmap.xsize),next_power_of_2(bitmap.ysize)); } glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, bitmap.xsize, bitmap.ysize, border ? 1 : 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap.mem); } else { //! MIPMAPPING (default) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); if ((count_bits_set(bitmap.xsize)==1 && count_bits_set(bitmap.ysize)==1) || GLEW_ARB_texture_non_power_of_two) { glBuildMipmaps(GL_TEXTURE_2D, GL_RGBA8, bitmap.xsize, bitmap.ysize, GL_RGBA, GL_UNSIGNED_BYTE, bitmap.mem); } else { //! glu auto resizes to next POT gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, bitmap.xsize, bitmap.ysize, GL_RGBA, GL_UNSIGNED_BYTE, bitmap.mem); } } if (aniso && GLEW_EXT_texture_filter_anisotropic) { static GLfloat maxAniso = -1.0f; if (maxAniso == -1.0f) { glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAniso); } glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAniso); } } texInfo.id = texID; texInfo.type = bitmap.type; texInfo.xsize = bitmap.xsize; texInfo.ysize = bitmap.ysize; texMap[texName] = texInfo; return true; }