Exemplo n.º 1
0
SymbolResolver::SymbolResolver()
    : m_DbgHelp(std::experimental::make_unique_resource(
          ::LoadLibrary(TEXT("DbgHelp.dll")), &::FreeLibrary)),
      m_SymInitialize(reinterpret_cast<SymInitializeType>(
          ::GetProcAddress(m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymInitialize)))),
      m_SymCleanup(reinterpret_cast<SymCleanupType>(
          ::GetProcAddress(m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymCleanup)))),
      m_SymSetOptions(reinterpret_cast<SymSetOptionsType>(
          ::GetProcAddress(m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymSetOptions)))),
      m_SymGetOptions(reinterpret_cast<SymGetOptionsType>(
          ::GetProcAddress(m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymGetOptions)))),
      m_SymFromName(reinterpret_cast<SymFromNameType>(
          ::GetProcAddress(m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymFromName)))),
      m_SymLoadModuleEx(reinterpret_cast<SymLoadModuleExType>(::GetProcAddress(
          m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymLoadModuleEx)))),
      m_SymUnloadModule64(
          reinterpret_cast<SymUnloadModule64Type>(::GetProcAddress(
              m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymUnloadModule64)))),
      m_SymGetSearchPath(
          reinterpret_cast<SymGetSearchPathType>(::GetProcAddress(
              m_DbgHelp, SYMBOLRESOLVER_TOSTRING(SymGetSearchPath)))),
      m_Process(std::experimental::make_unique_resource(
          ::GetCurrentProcess(),
          *const_cast<SymCleanupType *>(&m_SymCleanup))) {
// Delete these macros
#undef SYMBOLRESOLVER_STRINGIFY
#undef SYMBOLRESOLVER_TOSTRING

  if (!m_DbgHelp || !m_SymInitialize || !m_SymCleanup || !m_SymSetOptions ||
      !m_SymGetOptions || !m_SymFromName || !m_SymLoadModuleEx ||
      !m_SymUnloadModule64 || !m_SymGetSearchPath) {
    ThrowRuntimeError(
        TEXT("At least one of DbgHelp APIs was not initialized."));
  }

  TCHAR dbgHelpPath[MAX_PATH];
  ::GetModuleFileName(m_DbgHelp.get(), dbgHelpPath, _countof(dbgHelpPath));

  const auto originalOptions = m_SymGetOptions();
  m_SymSetOptions(originalOptions | SYMOPT_CASE_INSENSITIVE | SYMOPT_DEBUG |
                  SYMOPT_UNDNAME | SYMOPT_AUTO_PUBLICS | SYMOPT_DEFERRED_LOADS);

  // Use a predefined symbols search path if _NT_SYMBOL_PATH is not registered
  const auto ret =
      ::GetEnvironmentVariable(TEXT("_NT_SYMBOL_PATH"), nullptr, 0);
  TCHAR *path = nullptr;
  if (ret == 0 && ::GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
    path = TEXT(".;srv*.\\Symbols*http://msdl.microsoft.com/download/symbols");
  }

  if (!m_SymInitialize(m_Process, path, FALSE)) {
    ThrowRuntimeError(TEXT("SymInitialize failed."));
  }
}
Exemplo n.º 2
0
GroupObserver::GroupObserver(std::vector<std::shared_ptr<Group>> groups, std::vector<GroupEventType> eventTypes)
{
	mGroups = groups;
	mEventTypes = eventTypes;
	mAddEntityCache = std::bind(&GroupObserver::AddEntity, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);

	if(groups.size() != eventTypes.size())
	{
		ThrowRuntimeError("Error, group and eventType vector counts must be equal");
	}

	Activate();
}
Exemplo n.º 3
0
void Shader::Reload(const bool forceLoad)
{
	std::vector<GLuint> shaders;
	bool errors = false;

	for(const auto &shaderFile : mShaderFiles)
	{
		auto shader = Shader::CreateShader(shaderFile.first, shaderFile.second);

		if(! shader)
		{
			if(forceLoad)
			{
				ThrowRuntimeError("Error compiling shader: %s", shaderFile.second.c_str());
			}
			else
			{
				App::Log()->Warning("Warning, error compiling shader: %s", shaderFile.second.c_str());
				errors = true;
			}

			break;
		}

		shaders.emplace_back(shader);
	}

	if(errors)
	{
		for(const auto &shader : shaders)
		{
			glDeleteShader(shader);
		}

		return;
	}

	auto shaderProgram = Shader::CreateProgram(shaders);

	if(! shaderProgram)
	{
		App::Log()->Warning("Warning, error compiling shader program from the following files:");

		for(const auto &shaderFile : mShaderFiles)
		{
			App::Log()->Warning("	%s", shaderFile.second.c_str());
		}

		if(forceLoad)
		{
			ThrowRuntimeError("Error compiling shader program.");
		}
	}
	else
	{
		if(mShaderProgram)
		{
			glDeleteProgram(mShaderProgram);
		}

		mShaderProgram = shaderProgram;
		lastShaderProgram = 0;

		// TODO: Shader: UBO indexes -> Renderer (ForwardRenderer)
		BindUniformBlock("GlobalMatrices", 0);
		//BindUniformBlock("World", 1);
		//BindUniformBlock("Material", 2);
		//BindUniformBlock("Light", 3);

		mUniformCache.clear();
	}
}