void CDecalsDrawerGL4::Draw() { trackHandler.Draw(); SCOPED_TIMER("DecalsDrawerGL4::Draw"); if (!GetDrawDecals()) return; if (!AnyDecalsInView()) return; // disable parallax, when we are lagging for a while /*static bool wi = true; const bool setTimerQuery = drawTimerQuery.Available() || wi; if (setTimerQuery) { wi = false; const float lastDrawTime = drawTimerQuery.QueryMilliSeconds(); static float avgfoo[2] = {0,0}; float& f = avgfoo[decalShader->GetFlagBool("USE_PARALLAX")]; f = mix(f, lastDrawTime, 0.2f); LOG_L(L_ERROR, "CDecalsDrawerGL4::Update %fms %fms", avgfoo[0], avgfoo[1]); if (lastDrawTime > 5.f) { ++laggedFrames; if (laggedFrames > 30) { LOG_L(L_ERROR, "Disabling Parallax decals"); decalShader->SetFlag("USE_PARALLAX", false); } } else { laggedFrames = 0; } drawTimerQuery.Start(); }*/ // we render the decals in screen space // for that we need the depth, to be able to reconstruct the worldpos #ifdef glCopyTextureSubImage2D if (GLEW_EXT_direct_state_access) { glCopyTextureSubImage2D(depthTex, 0, 0, 0, globalRendering->viewPosX, 0, globalRendering->viewSizeX, globalRendering->viewSizeY); } else #endif { glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, depthTex); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, globalRendering->viewPosX, 0, globalRendering->viewSizeX, globalRendering->viewSizeY); } glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_SRC_ALPHA); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glDepthMask(GL_FALSE); glEnable(GL_DEPTH_CLAMP); //glEnable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_LESS, 1.0f); decalShader->SetFlag("HAVE_SHADOWS", shadowHandler->ShadowsLoaded()); decalShader->SetFlag("HAVE_INFOTEX", infoTextureHandler->IsEnabled()); decalShader->Enable(); decalShader->SetUniform3v("camPos", &camera->GetPos()[0]); decalShader->SetUniform3v("camDir", &camera->GetDir()[0]); CMatrix44f vpi = camera->GetViewProjectionMatrixInverse(); vpi.Translate(-OnesVector); vpi.Scale(OnesVector * 2.f); decalShader->SetUniformMatrix4x4("viewProjMatrix", false, camera->GetViewProjectionMatrix().m); decalShader->SetUniformMatrix4x4("viewProjMatrixInv", false, vpi.m); const std::array<GLuint,5> textures = { atlasTex, static_cast<CSMFReadMap*>(readMap)->GetNormalsTexture(), shadowHandler->GetShadowTextureID(), infoTextureHandler->GetCurrentInfoTexture(), depthTex }; glSpringBindTextures(0, textures.size(), &textures[0]); if (shadowHandler->ShadowsLoaded()) { CMatrix44f sm = shadowHandler->GetShadowMatrix(); sm.GetPos() += float3(0.5f, 0.5f, 0.0f); decalShader->SetUniformMatrix4x4("shadowMatrix", false, sm.m); decalShader->SetUniform("shadowDensity", sky->GetLight()->GetGroundShadowDensity()); } // Draw DrawDecals(); glDisable(GL_DEPTH_CLAMP); glEnable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glCullFace(GL_BACK); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_BLEND); glDisable(GL_ALPHA_TEST); decalShader->Disable(); //if (setTimerQuery) drawTimerQuery.Stop(); }
PIGLIT_GL_TEST_CONFIG_END /** Test texture size errors and subtexture position errors */ static bool test_pos_and_sizes(void) { bool pass = true; GLuint name; /* all of these should generate GL_INVALID_VALUE */ glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, -16, 0, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, -6, -5, 0, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; glTexImage2D(GL_TEXTURE_2D, -2, GL_RGBA, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; glTexImage2D(GL_TEXTURE_2D, 2000, GL_RGBA, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; /* Setup dsa. */ glCreateTextures(GL_TEXTURE_2D, 1, &name); glBindTextureUnit(0, name); /* Since next command isn't bindless. */ /* setup valid 2D texture for subsequent TexSubImage calls */ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_FLOAT, NULL); glTextureSubImage2D(name, 0, 6, 6, 100, 100, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; glTextureSubImage2D(name, 0, -6, -6, 10, 10, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; glCopyTextureSubImage2D(name, 0, -6, -6, 2, 2, 10, 10); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; glCopyTextureSubImage2D(name, 0, 6, 6, 2, 2, 200, 200); pass = piglit_check_gl_error(GL_INVALID_VALUE) && pass; /* mipmap level 1 doesn't exist */ glTextureSubImage2D(name, 1, 0, 0, 8, 8, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass; /* mipmap level 2 doesn't exist */ glCopyTextureSubImage2D(name, 2, 0, 0, 0, 0, 4, 4); pass = piglit_check_gl_error(GL_INVALID_OPERATION) && pass; /* To test 1D and 3D entry points, let's try using the wrong functions. */ glTextureSubImage1D(name, 0, 0, 4, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass; glTextureSubImage3D(name, 0, 0, 0, 0, 4, 4, 4, GL_RGBA, GL_FLOAT, NULL); pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass; glCopyTextureSubImage1D(name, 0, 0, 0, 0, 4); pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass; glCopyTextureSubImage3D(name, 0, 0, 0, 0, 0, 0, 4, 4); pass = piglit_check_gl_error(GL_INVALID_ENUM) && pass; return pass; }