Example #1
0
GLuint CreateProgram(int nType, const char* pShader)
{
	MP_ASSERT(0 == glGetError());
	GLuint handle = glCreateShaderObjectARB(nType);
	glShaderSource(handle, 1, (const char**)&pShader, 0);
	glCompileShader(handle);
	DumpGlLog(handle);
	MP_ASSERT(handle);	
	MP_ASSERT(0 == glGetError());
	return handle;
}
Example #2
0
mreal_t ASTCall::evaluate(void* data) const
{
  mreal_t result = 0.0f;
  mreal_t t[10];
  size_t i, len = _arguments.getLength();

  for (i = 0; i < len; i++)
  {
    t[i] = _arguments[i]->evaluate(data);
  }

  void* fn = getFunction()->getPtr();
  MP_ASSERT(getFunction()->getArguments() == len);

  switch (len)
  {
    case 0: result = ((MFunc_Ret_F_ARG0)fn)(); break;
    case 1: result = ((MFunc_Ret_F_ARG1)fn)(t[0]); break;
    case 2: result = ((MFunc_Ret_F_ARG2)fn)(t[0], t[1]); break;
    case 3: result = ((MFunc_Ret_F_ARG3)fn)(t[0], t[1], t[2]); break;
    case 4: result = ((MFunc_Ret_F_ARG4)fn)(t[0], t[1], t[2], t[3]); break;
    case 5: result = ((MFunc_Ret_F_ARG5)fn)(t[0], t[1], t[2], t[3], t[4]); break;
    case 6: result = ((MFunc_Ret_F_ARG6)fn)(t[0], t[1], t[2], t[3], t[4], t[5]); break;
    case 7: result = ((MFunc_Ret_F_ARG7)fn)(t[0], t[1], t[2], t[3], t[4], t[5], t[6]); break;
    case 8: result = ((MFunc_Ret_F_ARG8)fn)(t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7]); break;
  }

  return result;
}
Example #3
0
mresult_t ExpressionParser::parseTree(ASTElement** dst)
{
  Vector<ASTElement*> elements;
  mresult_t result = MRESULT_OK;

  for (;;)
  {
    ASTElement* ast = NULL;
    if ((result = parseExpression(&ast, NULL, 0, false)) != MRESULT_OK)
      goto failed;
    if (ast) elements.append(ast);

    MP_ASSERT(_last.tokenType != MTOKEN_ERROR);
    switch (_last.tokenType)
    {
      case MTOKEN_END_OF_INPUT:
        goto finished;
      case MTOKEN_COMMA:
      case MTOKEN_RPAREN:
        result = MRESULT_UNEXPECTED_TOKEN;
        goto failed;
      case MTOKEN_SEMICOLON:
        // Skip semicolon and parse next expression
        _tokenizer.next(&_last);
        break;
    }
  }

finished:
  if (elements.getLength() == 0)
  {
    return MRESULT_NO_EXPRESSION;
  }
  else if (elements.getLength() == 1)
  {
    *dst = elements[0];
    return MRESULT_OK;
  }
  else
  {
    ASTBlock* block = new ASTBlock(_ctx.genId());
    block->getChildrenVector().swap(elements);

    *dst = block;
    return MRESULT_OK;
  }

failed:
  for (size_t i = 0; i < elements.getLength(); i++) delete elements[i];
  return result;
}
Example #4
0
void DumpGlLog(GLuint handle)
{
	return;
	int nLogLen = 0;
	MP_ASSERT(0 == glGetError());
	glGetObjectParameterivARB(handle, GL_OBJECT_INFO_LOG_LENGTH_ARB, &nLogLen);
	if(nLogLen > 1) 
	{
		char* pChars = (char*)malloc(nLogLen);
		int nLen = 0;
		glGetInfoLogARB(handle, nLogLen, &nLen, pChars);

		printf("COMPILE MESSAGE\n%s\n\n", pChars);

		free(pChars);
		__BREAK();
	}
	CheckGlError();
}
Example #5
0
void DrawGLStuff()
{
	MICROPROFILE_SCOPEI("MicroProfile", "DRAWSTUFF", 0xffff3456);
	MICROPROFILE_SCOPEGPUI("DRAWSTUFF", 0xffff4444);
	glUseProgramObjectARB(g_Program);
	glBindVertexArray(g_VAO);
	static float f = 0;
	f += 0.01f;
	int amount =(int)( (((cos(f) + 1) * 0.5f) *10)+ 2);
	MP_ASSERT(amount > 0);
	for(int i = 0; i < amount; ++i)
	{
		MICROPROFILE_SCOPEGPUI("DRAWSTUFF_INNER", 0xffff4444);

		glDrawArrays(GL_TRIANGLES, 0, QUADS*6);
	}
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	glUseProgramObjectARB(0);
	glBindVertexArray(0);

}
Example #6
0
mreal_t ASTOperator::evaluate(void* data) const
{
  mreal_t result;

  switch (getOperatorType())
  {
    case MOPERATOR_ASSIGN:
    {
      MP_ASSERT(_left->getElementType() == MELEMENT_VARIABLE);
      result = _right->evaluate(data);
      reinterpret_cast<mreal_t*>((char*)data +
        reinterpret_cast<ASTVariable*>(_left)->getOffset())[0] = result;
      break;
    }
    case MOPERATOR_PLUS:
      result = _left->evaluate(data) + _right->evaluate(data);
      break;
    case MOPERATOR_MINUS:
      result = _left->evaluate(data) - _right->evaluate(data);
      break;
    case MOPERATOR_MUL:
      result = _left->evaluate(data) * _right->evaluate(data);
      break;
    case MOPERATOR_DIV:
      result = _left->evaluate(data) / _right->evaluate(data);
      break;
    case MOPERATOR_MOD:
    {
      mreal_t vl = _left->evaluate(data);
      mreal_t vr = _right->evaluate(data);
      result = fmodf(vl, vr);
      break;
    }
  }

  return result;
}
Example #7
0
int main(int argc, char* argv[])
{

	MICROPROFILE_REGISTER_GROUP("Thread0", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("Thread1", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("Thread2", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("Thread2xx", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("MAIN", "main", 0x88fff00f);


	g_QueueGraphics = MICROPROFILE_GPU_INIT_QUEUE("GPU-Graphics-Queue");

	printf("press 'z' to toggle microprofile drawing\n");
	printf("press 'right shift' to pause microprofile update\n");
	printf("press 'x' to toggle profiling\n");
	printf("press 'c' to toggle enable of all profiler groups\n");
	MicroProfileOnThreadCreate("AA_Main");
	if(SDL_Init(SDL_INIT_VIDEO) < 0) {
		return 1;
	}


	SDL_GL_SetAttribute(SDL_GL_RED_SIZE,    	    8);
	SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,  	    8);
	SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,   	    8);
	SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,  	    8);
	SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,  	    24);
	SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE,  	    8);	
	SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,		    32);	
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,	    1);	
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
	SDL_GL_SetSwapInterval(1);

	SDL_Window * pWindow = SDL_CreateWindow("microprofiledemo", 10, 10, WIDTH, HEIGHT, SDL_WINDOW_OPENGL);
	if(!pWindow)
		return 1;

	SDL_GLContext glcontext = SDL_GL_CreateContext(pWindow);

	glewExperimental=1;
	GLenum err=glewInit();
	if(err!=GLEW_OK)
	{
		__BREAK();
	}
	glGetError(); //glew generates an error
		


#if MICROPROFILE_ENABLED
	MicroProfileGpuInitGL();
	MicroProfileDrawInit();
	MP_ASSERT(glGetError() == 0);
	MicroProfileToggleDisplayMode();
	
	MicroProfileInitUI();

	MicroProfileCustomGroup("Custom1", 2, 47, 2.f, MICROPROFILE_CUSTOM_BARS);
	MicroProfileCustomGroupAddTimer("Custom1", "MicroProfile", "Draw");
	MicroProfileCustomGroupAddTimer("Custom1", "MicroProfile", "Detailed View");

	MicroProfileCustomGroup("Custom2", 2, 100, 20.f, MICROPROFILE_CUSTOM_BARS|MICROPROFILE_CUSTOM_BAR_SOURCE_MAX);
	MicroProfileCustomGroupAddTimer("Custom2", "MicroProfile", "Draw");
	MicroProfileCustomGroupAddTimer("Custom2", "MicroProfile", "Detailed View");


	MicroProfileCustomGroup("Custom3", 2, 0, 5.f, MICROPROFILE_CUSTOM_STACK|MICROPROFILE_CUSTOM_STACK_SOURCE_MAX);
	MicroProfileCustomGroupAddTimer("Custom3", "MicroProfile", "Draw");
	MicroProfileCustomGroupAddTimer("Custom3", "MicroProfile", "Detailed View");



	MicroProfileCustomGroup("ThreadSafe", 6, 10, 600.f, MICROPROFILE_CUSTOM_BARS | MICROPROFILE_CUSTOM_STACK);
	MicroProfileCustomGroupAddTimer("ThreadSafe", "ThreadSafe", "main");
	MicroProfileCustomGroupAddTimer("ThreadSafe", "ThreadSafe", "inner0");
	MicroProfileCustomGroupAddTimer("ThreadSafe", "ThreadSafe", "inner1");
	MicroProfileCustomGroupAddTimer("ThreadSafe", "ThreadSafe", "inner2");
	MicroProfileCustomGroupAddTimer("ThreadSafe", "ThreadSafe", "inner3");
	MicroProfileCustomGroupAddTimer("ThreadSafe", "ThreadSafe", "inner4");
#endif
	MICROPROFILE_COUNTER_CONFIG("memory/main", MICROPROFILE_COUNTER_FORMAT_BYTES, 10ll<<30ll, 0);
	MICROPROFILE_COUNTER_CONFIG("memory/gpu/indexbuffers", MICROPROFILE_COUNTER_FORMAT_BYTES, 0, 0);
	MICROPROFILE_COUNTER_CONFIG("memory/gpu/vertexbuffers", MICROPROFILE_COUNTER_FORMAT_BYTES, 0, 0);
	MICROPROFILE_COUNTER_CONFIG("memory/mainx", MICROPROFILE_COUNTER_FORMAT_BYTES, 10000, 0);

	MICROPROFILE_COUNTER_ADD("memory/main", 1000);
	MICROPROFILE_COUNTER_ADD("memory/gpu/vertexbuffers", 1000);
	MICROPROFILE_COUNTER_ADD("memory/gpu/indexbuffers", 200);
	MICROPROFILE_COUNTER_ADD("memory//", 10<<10);
	MICROPROFILE_COUNTER_ADD("memory//main", (32ll<<30ll) + (1ll <<29ll));
	MICROPROFILE_COUNTER_ADD("//memory//mainx/\\//", 1000);
	MICROPROFILE_COUNTER_ADD("//memoryx//mainx/", 1000);
	MICROPROFILE_COUNTER_ADD("//memoryy//main/", -1000000);
	MICROPROFILE_COUNTER_ADD("//\\\\///lala////lelel", 1000);
	MICROPROFILE_COUNTER_CONFIG("engine/frames", MICROPROFILE_COUNTER_FORMAT_DEFAULT, 1000, 0);
	MICROPROFILE_COUNTER_SET("fisk/geder/", 42);
	MICROPROFILE_COUNTER_SET("fisk/aborre/", -2002);
	MICROPROFILE_COUNTER_SET_LIMIT("fisk/aborre/", 120);
	static int Frames = 0;
	static uint64_t FramesX = 0;
	MICROPROFILE_COUNTER_SET_INT64_PTR("frames/int64", &FramesX);
	MICROPROFILE_COUNTER_SET_INT32_PTR("frames/int32", &Frames);

	MICROPROFILE_COUNTER_CONFIG("/test/sinus", MICROPROFILE_COUNTER_FORMAT_BYTES, 0, MICROPROFILE_COUNTER_FLAG_DETAILED);
	MICROPROFILE_COUNTER_CONFIG("/test/cosinus", MICROPROFILE_COUNTER_FORMAT_DEFAULT, 0, MICROPROFILE_COUNTER_FLAG_DETAILED);
	MICROPROFILE_COUNTER_CONFIG("/runtime/sdl_frame_events", MICROPROFILE_COUNTER_FORMAT_DEFAULT, 0, MICROPROFILE_COUNTER_FLAG_DETAILED);

	StartFakeWork();
	while(!g_nQuit)
	{
		Frames++;
		FramesX += 1024*1024;
		MICROPROFILE_SCOPE(MAIN);
		MICROPROFILE_COUNTER_ADD("engine/frames", 1);

		SDL_Event Evt;
		while(SDL_PollEvent(&Evt))
		{
			MICROPROFILE_COUNTER_LOCAL_ADD(SDLFrameEvents, 1);
			HandleEvent(&Evt);
		}

		MICROPROFILE_COUNTER_LOCAL_UPDATE_SET(SDLFrameEvents);
		glClearColor(0.3f,0.4f,0.6f,0.f);
		glViewport(0, 0, WIDTH, HEIGHT);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


#if 1||FAKE_WORK
		{
			MICROPROFILE_SCOPEI("BMain", "Dummy", 0xff3399ff);
			for(uint32_t i = 0; i < 14; ++i)
			{
				MICROPROFILE_SCOPEI("BMain", "1ms", 0xff3399ff);
				MICROPROFILE_META_CPU("Sleep",1);

				usleep(1000);
			}
		}
#endif




		MicroProfileMouseButton(g_MouseDown0, g_MouseDown1);
		MicroProfileMousePosition(g_MouseX, g_MouseY, g_MouseDelta);
		g_MouseDelta = 0;


		MicroProfileFlip(0);
		static float f = 0;
		f += 0.1f;
		int sinus = (int)(10000000 * (sinf(f)));
		int cosinus = int(cosf(f*1.3f) * 100000 + 50000);
		MICROPROFILE_COUNTER_SET("/test/sinus", sinus);
		MICROPROFILE_COUNTER_SET("/test/cosinus", cosinus);
		{
			MICROPROFILE_SCOPEGPUI("MicroProfileDraw", 0x88dd44);
			float projection[16];
			float left = 0.f;
			float right = WIDTH;
			float bottom = HEIGHT;
			float top = 0.f;
			float near = -1.f;
			float far = 1.f;
			memset(&projection[0], 0, sizeof(projection));

			projection[0] = 2.0f / (right - left);
			projection[5] = 2.0f / (top - bottom);
			projection[10] = -2.0f / (far - near);
			projection[12] = - (right + left) / (right - left);
			projection[13] = - (top + bottom) / (top - bottom);
			projection[14] = - (far + near) / (far - near);
			projection[15] = 1.f; 
 
 			glEnable(GL_BLEND);
 			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 			glDisable(GL_DEPTH_TEST);
#if MICROPROFILE_ENABLED
			MicroProfileBeginDraw(WIDTH, HEIGHT, &projection[0]);
			MicroProfileDraw(WIDTH, HEIGHT);
			MicroProfileEndDraw();
#endif
			glDisable(GL_BLEND);
		}

		MICROPROFILE_SCOPEI("MAIN", "Flip", 0xffee00);
		SDL_GL_SwapWindow(pWindow);
	}
	StopFakeWork();

	MicroProfileShutdown();

  	SDL_GL_DeleteContext(glcontext);  
 	SDL_DestroyWindow(pWindow);
 	SDL_Quit();


	return 0;
}
Example #8
0
mresult_t ExpressionParser::parseExpression(ASTElement** dst,
  ASTElement* _left,
  int minPriority,
  bool isInsideExpression)
{
  ASTElement* left = _left;
  ASTElement* right = NULL;

  mresult_t result = MRESULT_OK;
  uint op = MOPERATOR_NONE;

  Token& token = _last;
  Token helper;

  for (;;)
  {
    _tokenizer.next(&token);

    switch (token.tokenType)
    {
      // ----------------------------------------------------------------------
      case MTOKEN_ERROR:
        _tokenizer.back(&token);
        result = MRESULT_INVALID_TOKEN;
        goto failure;
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      case MTOKEN_COMMA:
      case MTOKEN_SEMICOLON:
        if (left == NULL)
        {
          return (isInsideExpression)
            ? MRESULT_UNEXPECTED_TOKEN
            : MRESULT_OK;
        }
        // ... fall through ...
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      case MTOKEN_END_OF_INPUT:
        if (op != MOPERATOR_NONE)
        {
          // Operand expected
          result = MRESULT_EXPRESSION_EXPECTED;
          goto failure;
        }

        _tokenizer.back(&token);
        *dst = left;
        return MRESULT_OK;
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      case MTOKEN_INTEGER:
      case MTOKEN_FLOAT:
        if (left != NULL && op == MOPERATOR_NONE)
        {
          // Expected operator or end of expression
          result = MRESULT_UNEXPECTED_TOKEN;
          goto failure;
        }

        right = new ASTConstant(_ctx.genId(), token.f);
        break;
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      case MTOKEN_LPAREN:
        if (left != NULL && op == MOPERATOR_NONE)
        {
          // Expected operator or end of expression
          result = MRESULT_UNEXPECTED_TOKEN;
          goto failure;
        }

        result = parseExpression(&right, NULL, 0, true);
        if (result != MRESULT_OK)
          goto failure;

        _tokenizer.next(&token);
        if (token.tokenType != MTOKEN_RPAREN)
        {
          result = MRESULT_UNEXPECTED_TOKEN;
          goto failure;
        }

        break;
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      case MTOKEN_RPAREN:
        if (op != MOPERATOR_NONE)
        {
          result = MRESULT_UNEXPECTED_TOKEN;
          goto failure;
        }

        if (left == NULL && isInsideExpression)
        {
          result = MRESULT_UNEXPECTED_TOKEN;
          goto failure;
        }

        _tokenizer.back(&token);
        *dst = left;
        return MRESULT_OK;
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      case MTOKEN_OPERATOR:
        if (token.operatorType == MOPERATOR_ASSIGN)
        {
          /* Why not?
          // Assignment inside expression is not allowed.
          if (isInsideExpression)
          {
            result = MRESULT_ASSIGNMENT_INSIDE_EXPRESSION;
            goto failure;
          }
          */

          // Can assign only to a variable
          if (left == NULL || left->getElementType() != MELEMENT_VARIABLE)
          {
            result = MRESULT_ASSIGNMENT_TO_NON_VARIABLE;
            goto failure;
          }
        }

        if (op != MOPERATOR_NONE || left == NULL)
        {
          if (token.operatorType == MOPERATOR_PLUS)
            // Ignore unary plus
            continue;

          if (token.operatorType == MOPERATOR_MINUS)
          {
            // Unary minus
            result = parseExpression(&right, right, mpOperatorInfo[MOPERATOR_UMINUS].priority, true);
            if (result != MRESULT_OK)
              goto failure;

            if (right == NULL)
            {
              result = MRESULT_EXPRESSION_EXPECTED;
              goto failure;
            }

            ASTTransform* transform = new ASTTransform(_ctx.genId());
            transform->setTransformType(MTRANSFORM_NEGATE);
            transform->setChild(right);
            right = transform;
            break;
		  }
          result = MRESULT_UNEXPECTED_TOKEN;
          goto failure;
		}

        op = token.operatorType;
		if (mpOperatorInfo[op].priority < minPriority || (mpOperatorInfo[op].priority == minPriority && mpOperatorInfo[op].assoc == LeftAssoc))
        {
          _tokenizer.back(&token);

          *dst = left;
          return MRESULT_OK;
        }
        continue;
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      case MTOKEN_SYMBOL:
      {
        if (left != NULL && op == MOPERATOR_NONE)
        {
          // Expected operator or end of expression
          result = MRESULT_UNEXPECTED_TOKEN;
          goto failure;
        }

        const char* symbolName = _tokenizer.beg + token.pos;
        size_t symbolLength = token.len;

        Token ttoken;
        bool isFunction = (_tokenizer.peek(&ttoken) == MTOKEN_LPAREN);

        // Parse function
        if (isFunction)
        {
          Function* function = _ctx._ctx->functions.get(symbolName, symbolLength);
          if (function == NULL)
          {
            result = MRESULT_INVALID_FUNCTION;
            goto failure;
          }

          // Parse LPAREN token again
          _tokenizer.next(&ttoken);

          Vector<ASTElement*> arguments;

          // Parse function arguments
          int numArgs = function->getArgumentsCount();
          int n = 0;
          for (;;++n)
          {
            _tokenizer.next(&ttoken);

            if (ttoken.tokenType == MTOKEN_ERROR)
            {
              mpDeleteAll(arguments);
              result = MRESULT_INVALID_TOKEN;
              goto failure;
            }

            // ')' - End of function call
            if (ttoken.tokenType == MTOKEN_RPAREN)
            {
              if (n == numArgs) break;

              mpDeleteAll(arguments);
              result = MRESULT_NOT_ENOUGH_ARGUMENTS;
              goto failure;
            }

            // ',' - Arguments delimiter
            if (n != 0)
            {
              if (ttoken.tokenType == MTOKEN_COMMA)
              {
                if (n >= numArgs)
                {
                  mpDeleteAll(arguments);
                  result = MRESULT_TOO_MANY_ARGUMENTS;
                  goto failure;
                }
              }
              else
              {
                mpDeleteAll(arguments);
                result = MRESULT_UNEXPECTED_TOKEN;
                goto failure;
              }
            }
            else
            {
              _tokenizer.back(&ttoken);
            }

            // Parse argument expression
            ASTElement* arg;
            if ((result = parseExpression(&arg, NULL, 0, true)) != MRESULT_OK)
            {
              mpDeleteAll(arguments);
              goto failure;
            }

            arguments.append(arg);
          }

          // Done
          ASTCall* call = new ASTCall(_ctx.genId(), function);
          call->swapArguments(arguments);
          right = call;
        }
        else
        // Parse variable
        {
          Variable* var = _ctx._ctx->variables.get(symbolName, symbolLength);
          if (var == NULL)
          {
            result = MRESULT_INVALID_SYMBOL;
            goto failure;
          }

          if (var->type == MVARIABLE_CONSTANT)
            right = new ASTConstant(_ctx.genId(), var->c.value);
          else
            right = new ASTVariable(_ctx.genId(), var);
        }

        break;
      }
      // ----------------------------------------------------------------------

      // ----------------------------------------------------------------------
      default:
        MP_ASSERT_NOT_REACHED();
      // ----------------------------------------------------------------------
    }

	MP_ASSERT(right != NULL);

    if (left)
    {
      _tokenizer.peek(&helper);

      if (helper.tokenType == MTOKEN_OPERATOR)
      {
        int lp = mpOperatorInfo[op].priority;
        int np = mpOperatorInfo[helper.operatorType].priority;
        if (lp < np || (lp == np && mpOperatorInfo[op].assoc == RightAssoc))
        {
          result = parseExpression(&right, right, lp, true);
          if (result != MRESULT_OK)
            goto failure;
        }
      }

      MP_ASSERT(op != MOPERATOR_NONE);
      ASTOperator* parent = new ASTOperator(_ctx.genId(), op);
      parent->setLeft(left);
      parent->setRight(right);

      left = parent;
      right = NULL;
      op = MOPERATOR_NONE;
    }
    else
    {
      left = right;
      right = NULL;
    }
  }

failure:
  if (left) delete left;
  if (right) delete right;

  *dst = NULL;
  return result;
}
Example #9
0
int main(int argc, char* argv[])
{

	MICROPROFILE_REGISTER_GROUP("Thread0", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("Thread1", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("Thread2", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("Thread2xx", "Threads", 0x88008800);
	MICROPROFILE_REGISTER_GROUP("GPU", "main", 0x88fff00f);
	MICROPROFILE_REGISTER_GROUP("MAIN", "main", 0x88fff00f);

	printf("press 'z' to toggle microprofile drawing\n");
	printf("press 'right shift' to pause microprofile update\n");
	printf("press 'x' to toggle profiling\n");
	printf("press 'c' to toggle enable of all profiler groups\n");
	MicroProfileOnThreadCreate("AA_Main");
	if(SDL_Init(SDL_INIT_VIDEO) < 0) {
		return 1;
	}


	SDL_GL_SetAttribute(SDL_GL_RED_SIZE,    	    8);
	SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,  	    8);
	SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,   	    8);
	SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,  	    8);
	SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,  	    24);
	SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE,  	    8);	
	SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,		    32);	
	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,	    1);	
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
	SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
	SDL_GL_SetSwapInterval(1);

	SDL_Window * pWindow = SDL_CreateWindow("microprofiledemo", 10, 10, WIDTH, HEIGHT, SDL_WINDOW_OPENGL);
	if(!pWindow)
		return 1;

	SDL_GLContext glcontext = SDL_GL_CreateContext(pWindow);

	glewExperimental=1;
	GLenum err=glewInit();
	if(err!=GLEW_OK)
	{
		__BREAK();
	}
	glGetError(); //glew generates an error
		


#if MICROPROFILE_ENABLED
	MicroProfileGpuInitGL();
	MicroProfileDrawInit();
	MP_ASSERT(glGetError() == 0);
	MicroProfileToggleDisplayMode();
#endif

	StartFakeWork();
	while(!g_nQuit)
	{
		MICROPROFILE_SCOPE(MAIN);

		SDL_Event Evt;
		while(SDL_PollEvent(&Evt))
		{
			HandleEvent(&Evt);
		}

		glClearColor(0.3f,0.4f,0.6f,0.f);
		glViewport(0, 0, WIDTH, HEIGHT);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


#if 1||FAKE_WORK
		{
			MICROPROFILE_SCOPEI("BMain", "Dummy", 0xff3399ff);
			for(uint32_t i = 0; i < 14; ++i)
			{
				MICROPROFILE_SCOPEI("BMain", "1ms", 0xff3399ff);
				MICROPROFILE_META_CPU("Sleep",1);

				usleep(1000);
			}
		}
#endif




		MicroProfileMouseButton(g_MouseDown0, g_MouseDown1);
		MicroProfileMousePosition(g_MouseX, g_MouseY, g_MouseDelta);
		g_MouseDelta = 0;


		MicroProfileFlip();
		{
			MICROPROFILE_SCOPEGPUI("MicroProfileDraw", 0x88dd44);
			float projection[16];
			float left = 0.f;
			float right = WIDTH;
			float bottom = HEIGHT;
			float top = 0.f;
			float near = -1.f;
			float far = 1.f;
			memset(&projection[0], 0, sizeof(projection));

			projection[0] = 2.0f / (right - left);
			projection[5] = 2.0f / (top - bottom);
			projection[10] = -2.0f / (far - near);
			projection[12] = - (right + left) / (right - left);
			projection[13] = - (top + bottom) / (top - bottom);
			projection[14] = - (far + near) / (far - near);
			projection[15] = 1.f; 
 
 			glEnable(GL_BLEND);
 			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 			glDisable(GL_DEPTH_TEST);
#if MICROPROFILE_ENABLED
			MicroProfileBeginDraw(WIDTH, HEIGHT, &projection[0]);
			MicroProfileDraw(WIDTH, HEIGHT);
			MicroProfileEndDraw();
#endif
			glDisable(GL_BLEND);
		}

		MICROPROFILE_SCOPEI("MAIN", "Flip", 0xffee00);
		SDL_GL_SwapWindow(pWindow);
	}
	StopFakeWork();

	MicroProfileShutdown();

  	SDL_GL_DeleteContext(glcontext);  
 	SDL_DestroyWindow(pWindow);
 	SDL_Quit();


	return 0;
}