Beispiel #1
0
static void
sendData(ls_timer* tim)
{
  unsigned char buf[1024];
  int           i;
  ls_err        err;
  UNUSED_PARAM(tim);

  config.numSentPkts++;

  for (i = 0; i < 1; i++)
  {
    int len = (numChar * i);
    /* TODO: parse this. */
    memcpy(buf + len,
           s1 + (config.numSentPkts % numChar) + (numChar * i),
           numChar);
  }

  if ( !tube_data(config.t, buf, strlen(s1), &err) )
  {
    LS_LOG_ERR(err, "tube_data");
  }

  if ( !tube_manager_schedule_ms(mgr, 50, sendData, NULL, NULL, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_schedule_ms");
    return;
  }
}
Beispiel #2
0
/*-------------------------------------
 * Attach shader objects to a program
-------------------------------------*/
bool ShaderProgramAssembly::assemble(ShaderProgram& outProg, bool runLinker) noexcept {
    LS_LOG_MSG("Attempting to assemble a Shader Program.");

    if (!is_assembly_valid()) {
        LS_LOG_ERR("\tFailed to assemble a Shader Program. Invalid inputs shader detected.\n");
        return false;
    }

    if (outProg.gpu_id() != 0) {
        LS_LOG_ERR("\tAttempted to assemble a preexisting program object.\n");
        return false;
    }
    else {
        const GLuint progId = glCreateProgram();

        LS_LOG_GL_ERR();

        if (progId == 0) {
            LS_LOG_ERR("\tUnable to create a handle to an OpenGL Shader Program.\n");
            return false;
        }

        outProg.gpuId = progId;
    }

    glAttachShader(outProg.gpu_id(), pVertShader->gpu_id());
    LS_LOG_GL_ERR();

    glAttachShader(outProg.gpu_id(), pFragShader->gpu_id());
    LS_LOG_GL_ERR();
    
    #ifdef LS_DRAW_BACKEND_GL
        if (pGeomShader && pGeomShader->is_valid()) {
            glAttachShader(outProg.gpu_id(), pGeomShader->gpu_id());
            LS_LOG_GL_ERR();
        }
    #endif

    // Ensure all shaders attached to the program correctly
    if (!assign_shader_layouts(outProg, *pVertShader)
    || !assign_shader_layouts(outProg, *pFragShader)
    ) {
        LS_LOG_ERR(
            "\tAn Error occurred while attaching a shader to the shader program ",
            outProg.gpu_id(), " during assembly. The shader program will be destroyed.\n"
        );
        outProg.terminate();
        return false;
    }

    LS_LOG_MSG("\tSuccessfully assembled the Shader Program ", outProg.gpu_id(), ".\n");

    if (runLinker) {
        return link(outProg);
    }

    return true;
}
Beispiel #3
0
/*-------------------------------------
 * Setup a shader's attributes
-------------------------------------*/
bool ShaderProgramAssembly::setup_program_attribs(ShaderProgram& outProg) const noexcept {
    outProg.uniforms = draw::get_shader_attribs(outProg, vertex_attrib_t::UNIFORM_ATTRIB);
    outProg.vertAttribs = get_linked_shader_attribs(outProg, shader_stage_t::SHADER_STAGE_VERTEX);
    outProg.fragAttribs = get_linked_shader_attribs(outProg, shader_stage_t::SHADER_STAGE_FRAGMENT);
    // not bothering to support geometry shader attributes.

    // Shader stages all need attributes
    if (!outProg.get_vertex_attribs().get_num_attribs()) {
        LS_LOG_ERR("\tFailed to introspect the vertex shader of ", outProg.gpu_id(), ".\n");
        LS_DEBUG_ASSERT(false);
        return false;
    }

    if (!outProg.get_fragment_attribs().get_num_attribs()) {
        LS_LOG_ERR("\tFailed to introspect the fragment shader of ", outProg.gpu_id(), ".\n");
        LS_DEBUG_ASSERT(false);
        return false;
    }
    
    const GLuint shaderId = outProg.gpu_id();
    GLint totalUniformBlocks = 0;
    
    glGetProgramiv(shaderId, GL_ACTIVE_UNIFORM_BLOCKS, &totalUniformBlocks);
    LS_LOG_GL_ERR();
    
    LS_LOG_MSG("\tLocated ", totalUniformBlocks, " uniform blocks in shader ", shaderId, '.');
    outProg.uniformBlocks.reset(new(std::nothrow) ShaderBlockAttrib[totalUniformBlocks]);
    
    if (!outProg.uniformBlocks) {
        LS_LOG_ERR("\tFailed to allocate space for ", totalUniformBlocks, " uniform blocks!");
        LS_DEBUG_ASSERT(false);
        return false;
    }
    
    for (int i = 0; i < totalUniformBlocks; ++i) {
        const bool isIntrospected = outProg.uniformBlocks[i].run_block_introspection(shaderId, i);
        
        if (!isIntrospected) {
            LS_LOG_ERR("\tFailed to introspect uniform block ", i, '.');
            outProg.uniformBlocks.reset();
            LS_DEBUG_ASSERT(false);
            return false;
        }
    }
    
    outProg.numUniformBlocks = totalUniformBlocks;
    
    return true;
}
Beispiel #4
0
/*-------------------------------------
    Render Context initialization
-------------------------------------*/
bool Context::init(const Display& disp, bool useVsync) {
    terminate();

    if (disp.is_running() == false) {
        LS_LOG_ERR("\tAttempted to initialize a render context with no display.\n");
        return false;
    }

    // Attach the OpenGL context to our window handle
    LS_LOG_MSG("Initializing an OpenGL rendering context.");
    pContext = SDL_GL_CreateContext(disp.get_window());

    if (!pContext) {
        LS_LOG_ERR(
            "\tUnable to create a render context through SDL.",
            "\n\t", SDL_GetError(),
            '\n'
            );
        terminate();
        return false;
    }
    LS_LOG_MSG("\tSuccessfully created a basic render context.");

    // Quick setup in order to normalize OpenGL to the display coordinates.
    this->make_current(disp);

    const math::vec2i&& displayRes = disp.get_resolution();
    glViewport(0, 0, displayRes[0], displayRes[1]);
    LS_LOG_GL_ERR();

    // Set the default back buffer color
    const ls::draw::color::color& mgcPnk = ls::draw::color::magenta;
    glClearColor(mgcPnk[0], mgcPnk[1], mgcPnk[2], mgcPnk[3]);
    LS_LOG_GL_ERR();

    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    LS_LOG_GL_ERR();

    set_vsync(useVsync);

    LS_LOG_MSG(
        "\tSuccessfully initialized a OpenGL 3.3-compatible render context:"
        "\n\tV-Sync: ", get_vsync()
        );

    LS_LOG_MSG("\tSuccessfully initialized the OpenGL 3.3 render context.\n");

    return true;
}
Beispiel #5
0
/*-------------------------------------
 * SDL initialization
-------------------------------------*/
bool MainState::bootstrap_subsystems() {
    if (SDL_WasInit(0) == SDL_INIT_EVERYTHING) {
        return true;
    }

    SDL_SetMainReady();

    constexpr uint32_t sdlInitFlags = 0
        | SDL_INIT_TIMER
        | SDL_INIT_AUDIO
        | SDL_INIT_VIDEO
        | SDL_INIT_EVENTS
        | SDL_INIT_JOYSTICK
        | SDL_INIT_GAMECONTROLLER
        | 0;
    
    SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "opengl");
    SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengles2");
    SDL_SetHint(SDL_HINT_RENDER_OPENGL_SHADERS, "1");

    if (SDL_Init(sdlInitFlags) < 0) {
        LS_LOG_ERR(
            "Unable to initialize SDL due to an internal library error: \"",
            SDL_GetError(), "\"\n",
            "Complain to your local programmer.\n"
        );
        return false;
    }
    
    SDL_LogSetAllPriority(SDL_LOG_PRIORITY_CRITICAL);
    
    LS_LOG_MSG("Successfully initialized SDL.\n", SDL_GetError(), '\n');

    /*
     * Setup the necessary parameters for OpenGL 3.3
     */
#ifdef LS_DRAW_BACKEND_GL
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
#else
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
#endif
    
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS,
        SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG
        
#ifdef LS_DEBUG
        | SDL_GL_CONTEXT_DEBUG_FLAG
#endif
    );
    SDL_ClearError();

    return true;
}
Beispiel #6
0
/*-------------------------------------
    Determine if *this Buffer Object is currently active.
-------------------------------------*/
bool BufferObject::is_bound() const noexcept {
    GLint typeToCheck = 0;

    switch (get_type()) {
        case buffer_use_t::VBO_BUFFER_ARRAY:
            typeToCheck = GL_ARRAY_BUFFER_BINDING;
            break;

        case buffer_use_t::VBO_BUFFER_ELEMENT:
            typeToCheck = GL_ELEMENT_ARRAY_BUFFER_BINDING;
            break;

        case buffer_use_t::VBO_BUFFER_TRANSFORM_FEEDBACK:
            typeToCheck = GL_TRANSFORM_FEEDBACK_BUFFER_BINDING;
            break;

        case buffer_use_t::VBO_BUFFER_UNIFORM_BUFFER:
            typeToCheck = GL_UNIFORM_BUFFER_BINDING;
            break;

        default:
            LS_LOG_ERR("Forgot to implement an enumeration for the current buffer type!");
            break;
    }

    // just fail, no room for debug statements here.
    LS_ASSERT(typeToCheck != 0);

    GLint currentBuffer = 0;
    glGetIntegerv(typeToCheck, &currentBuffer);
    return currentBuffer == (GLint)this->gpuId;
}
Beispiel #7
0
void *listen_run(void *p)
{
    CTEST_DATA(tube) *data = p;
    data->listen_return = tube_manager_loop(data->mgr,& data->err);
    if (!data->listen_return) {
        LS_LOG_ERR(data->err, "tube_manager_loop");
    }
    return data;
}
Beispiel #8
0
void
done(ls_timer* tim)
{
  ls_err err;
  UNUSED_PARAM(tim);
  printf("done\n");
  if ( !tube_manager_stop(mgr, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_stop");
  }
}
Beispiel #9
0
static void *_pool_calloc(size_t count, size_t size, void *context)
{
    ls_pool *pool = context;
    ls_err err;
    void *ptr;

    if (!ls_pool_calloc(pool, count, size, &ptr, &err)) {
        LS_LOG_ERR(err, "ls_pool_calloc");
        return NULL;
    }
    return ptr;
}
Beispiel #10
0
static void*
socketListen(void* ptr)
{
  ls_err err;
  UNUSED_PARAM(ptr);

  if ( !tube_manager_loop(mgr, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_loop");
  }
  return NULL;
}
Beispiel #11
0
void
done()
{
  ls_err err;
  if ( !tube_manager_stop(mgr, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_stop");
  }
  pthread_cancel(listenThread);
  pthread_join(listenThread, NULL);
  ls_log(LS_LOG_INFO, "DONE!");
  exit(0);
}
Beispiel #12
0
static void
loopstart_cb(ls_event_data* evt,
             void*          arg)
{
  ls_err err;
  UNUSED_PARAM(evt);
  UNUSED_PARAM(arg);

  if ( !tube_manager_open_tube(mgr,
                               (const struct sockaddr*)&config.remoteAddr,
                               &config.t,
                               &err) )
  {
    LS_LOG_ERR(err, "tube_open");
    return;
  }

  if ( !tube_print(config.t, &err) )
  {
    LS_LOG_ERR(err, "tube_print");
    return;
  }
}
Beispiel #13
0
/*-------------------------------------
 * Initialize secondary substates
-------------------------------------*/
bool MainState::setup_substates() {
    ls::game::GameSystem& sys = get_parent_system();
    
    if (0
    //||!sys.push_game_state(new(std::nothrow) HelloPropertyState{})
    //|| !sys.push_game_state(new(std::nothrow) HelloTextState{})
    //|| !sys.push_game_state(new(std::nothrow) HelloPrimState{})
    || !sys.push_game_state(new(std::nothrow) HelloMeshState{})
    ) {
        LS_LOG_ERR("Unable to run the internal render systems.\n");
        return false;
    }
        
    LS_LOG_MSG("Successfully created the internal rendering engine.\n");
    
    return true;
}
Beispiel #14
0
/*-------------------------------------
 * System Runtime
-------------------------------------*/
void MainState::on_run() {
    LS_LOG_GL_ERR();

    renderContext.make_current(*global::pDisplay);
    LS_LOG_GL_ERR();

    renderContext.flip(*global::pDisplay);
    LS_LOG_GL_ERR();
    
    const char* const pSdlErr = SDL_GetError();
    if (pSdlErr && pSdlErr[0] != '\0') {
        LS_LOG_ERR("SDL_ERROR: ", pSdlErr);
        SDL_ClearError();
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    LS_LOG_GL_ERR();
}
Beispiel #15
0
/*-------------------------------------
-------------------------------------*/
bool ShaderProgramAssembly::link(ShaderProgram& outProg) const noexcept {
    LS_LOG_MSG("Attempting to link the shader ", outProg.gpu_id(), '.');

    GLint linkResult = 0;

    glLinkProgram(outProg.gpu_id());
    LS_LOG_GL_ERR();

    glGetProgramiv(outProg.gpu_id(), GL_LINK_STATUS, &linkResult);
    LS_LOG_GL_ERR();

    GLint logLength = 0;

    glGetProgramiv(outProg.gpu_id(), GL_INFO_LOG_LENGTH, &logLength);
    LS_LOG_GL_ERR();

    utils::Pointer <GLchar[]> logData {new GLchar[logLength + 1]};
    logData[logLength] = '\0';

    glGetProgramInfoLog(outProg.gpu_id(), logLength, nullptr, logData.get());
    LS_LOG_GL_ERR();
    LS_LOG_MSG("\tProgram linker log:\n", logData.get(), '\n');

    if (linkResult != GL_TRUE) {
        LS_DEBUG_ASSERT(false);
        return false;
    }

    LS_LOG_MSG("\tSuccessfully linked shader ", outProg.gpu_id(), ". Now running introspection\n");
    if (!setup_program_attribs(outProg)) {
        LS_LOG_ERR("\tIntrospection of shader", outProg.gpu_id(), "failed during post-link setup.\n");
        return false;
    }

    LS_LOG_MSG(
        "\tDone. Successfully assembled and linked shader ", outProg.gpu_id(), ":",
        "\n\t\tUniforms:            ", outProg.uniforms.get_num_attribs(),
        "\n\t\tVertex Attribs:      ", outProg.vertAttribs.get_num_attribs(),
        "\n\t\tFragment Attribs:    ", outProg.fragAttribs.get_num_attribs(),
        '\n'
    );

    return true;
}
Beispiel #16
0
static int
markov()
{
  struct timespec timer;
  struct timespec remaining;
  tube*           t;
  ls_err          err;
  int             i;
  int*            iptr;

  timer.tv_sec = 0;

  while ( tube_manager_running(mgr) )
  {
    timer.tv_nsec = gauss(50000000, 10000000);
    nanosleep(&timer, &remaining);
    i = random() % NUM_TUBES;
    t = tubes[i];
    if (!t)
    {
      if ( !tube_create(&t, &err) )
      {
        LS_LOG_ERR(err, "tube_create");
        return 1;
      }
      tubes[i] = t;
      iptr     = malloc( sizeof(*iptr) );
      *iptr    = i;
      tube_set_data(t, iptr);
    }
    switch ( tube_get_state(t) )
    {
    case TS_START:
      ls_log(LS_LOG_ERROR, "invalid tube state");
      return 1;
    case TS_UNKNOWN:
      if ( !tube_manager_open_tube(mgr,
                                   (const struct sockaddr*)&remoteAddr,
                                   &t,
                                   &err) )
      {
        LS_LOG_ERR(err, "tube_manager_open_tube");
        return 1;
      }
      break;
    case TS_OPENING:
      /* keep waiting by the mailbox, Charlie Brown */
      break;
    case TS_RUNNING:
      /* .1% chance of close */
      if ( (random() % 10000) < 10 )
      {
        if ( !tube_close(t, &err) )
        {
          LS_LOG_ERR(err, "tube_close");
          return 1;
        }
      }
      else
      {
        /* TODO: put something intersting in the buffer */
        if ( !tube_data(t, data, random() % sizeof(data), &err) )
        {
          LS_LOG_ERR(err, "tube_data");
          return 1;
        }
      }
    case TS_RESUMING:
      /* can't get here yet */
      break;
    }
  }
  return 0;
}
Beispiel #17
0
int
spudtest(int    argc,
         char** argv)
{
  ls_err     err;
  size_t     i;
  const char nums[] = "0123456789";

  if (argc < 2)
  {
    fprintf(stderr, "spudload <destination>\n");
    exit(64);
  }
#if defined(__APPLE__)
  srandomdev();
#endif
#if defined(__LINUX__)
  srandom( time(NULL) );
#endif
  for (i = 0; i < sizeof(data); i++)
  {
    data[i] = nums[i % 10];
  }

  if ( !ls_sockaddr_get_remote_ip_addr(argv[1],
                                       "1402",
                                       (struct sockaddr*)&remoteAddr,
                                       sizeof(remoteAddr),
                                       &err) )
  {
    return 1;
  }

  if ( !tube_manager_create(0, &mgr, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_create");
    return 1;
  }
  if ( !tube_manager_socket(mgr, 0, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_socket");
    return 1;
  }

  if ( !tube_manager_signal(mgr, SIGINT, done, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_signal");
    return 1;
  }

  if ( !tube_manager_bind_event(mgr, EV_REMOVE_NAME, remove_cb, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_bind_event");
    return 1;
  }

  memset( tubes, 0, sizeof(tubes) );

  /* Start and listen to the sockets. */
  pthread_create(&listenThread, NULL, socketListen, NULL);

  return markov();
}
Beispiel #18
0
int
spudtest(int    argc,
         char** argv)
{
  ls_err                  err;
  int                     ch;
  struct sockaddr_storage addr;
  /* bool has_addr = false;; */

  while ( ( ch = getopt(argc, argv, "?hvs:") ) != -1 )
  {
    switch (ch)
    {
    case 'v':
      ls_log_set_level(LS_LOG_VERBOSE);
      break;
    case 's':
      if ( !ls_sockaddr_parse(optarg, (struct sockaddr*)&addr, sizeof(addr),
                              &err) )
      {
        LS_LOG_ERR(err, "Invalid address");
        return 1;
      }
      /* has_addr = true; */
      break;
    case 'h':
    case '?':
    default:
      usage();
      break;
    }
  }
  argc -= optind;
  argv += optind;

  if (argc < 1)
  {
    usage();
  }

  ls_log(LS_LOG_INFO, "entering spudtest");
  memset( &config, 0, sizeof(config) );

  if ( !ls_sockaddr_get_remote_ip_addr(argv[0],
                                       "1402",
                                       (struct sockaddr*)&config.remoteAddr,
                                       sizeof(config.remoteAddr),
                                       &err) )
  {
    LS_LOG_ERR(err, "ls_sockaddr_get_remote_ip_addr");
    return 1;
  }

  if ( !tube_manager_create(0, &mgr, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_create");
    return 1;
  }
  if ( !tube_manager_socket(mgr, 0, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_socket");
    return 1;
  }

  /* TODO: make source addresses work (again?). */
  /* if (has_addr) { */
  /*     LOGI("source address: %s\n", inet_ntop(AF_INET6, &addr, buf,
   * sizeof(buf))); */
  /* } */

  if ( !tube_manager_bind_event(mgr, EV_LOOPSTART_NAME, loopstart_cb, &err) ||
       !tube_manager_bind_event(mgr, EV_RUNNING_NAME, running_cb, &err) ||
       !tube_manager_bind_event(mgr, EV_DATA_NAME, data_cb, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_bind_event");
    return 1;
  }

  if ( !tube_manager_signal(mgr, SIGINT, done_sig, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_signal");
    return 1;
  }

  if ( !tube_manager_schedule_ms(mgr, 5000, done, NULL, NULL, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_schedule_ms");
    return 1;
  }

  if ( !tube_manager_loop(mgr, &err) )
  {
    LS_LOG_ERR(err, "tube_manager_loop");
  }

  return 0;
}