Esempio n. 1
0
void device_stage_texture(device_t device, stagesurf_t dst, texture_t src)
{
	struct gs_texture_2d *tex2d = (struct gs_texture_2d*)src;
	if (!can_stage(dst, tex2d))
		goto failed;

	if (!gl_copy_texture(device, dst->texture, GL_TEXTURE_2D,
				tex2d->base.texture, GL_TEXTURE_2D,
				dst->width, dst->height))
		goto failed;

	if (!gl_bind_texture(GL_TEXTURE_2D, dst->texture))
		goto failed;
	if (!gl_bind_buffer(GL_PIXEL_PACK_BUFFER, dst->pack_buffer))
		goto failed;

	glGetTexImage(GL_TEXTURE_2D, 0, dst->gl_format, dst->gl_type, 0);
	if (!gl_success("glGetTexImage"))
		goto failed;

	gl_bind_buffer(GL_PIXEL_PACK_BUFFER, 0);
	gl_bind_texture(GL_TEXTURE_2D, 0);
	return;

failed:
	gl_bind_buffer(GL_PIXEL_PACK_BUFFER, 0);
	gl_bind_texture(GL_TEXTURE_2D, 0);
	blog(LOG_ERROR, "device_stage_texture (GL) failed");
}
Esempio n. 2
0
void gl_draw_object(Scene_Camera* camera, Object* object) {
    glUseProgram(object->shader->id);
    glBindVertexArray(object->vao);

    //Build model matrix
    glm::mat4 model_matrix = build_model_matrix(object);

    //Combine matrices
    glm::mat4 model_view_projection = camera->projection * camera->view * model_matrix;
    glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(
        camera->view * model_matrix)));

    //Bind uniforms
    gl_bind_vec(object->shader->id, object->model->color, "matte_color");
    gl_bind_vec(object->shader->id, camera->direction, "camera_direction");
    gl_bind_vec(object->shader->id, object->light_direction, "light_direction");
    gl_bind_mat(object->shader->id, model_view_projection, "model_view_projection");
    gl_bind_mat(object->shader->id, normal_matrix, "normal_matrix");

    //bind textures
    gl_bind_texture(object->shader->id, object->texture->id, 0, "diffuse");
    gl_bind_texture(object->shader->id, object->normal_map->id, 1, "normal");
    gl_bind_texture(object->shader->id, object->specular_map->id, 2, "specular");

    //Render VAO
    glDrawArrays(GL_TRIANGLES, 0, object->model->face_count*3);

    //Unbind VAO
    glBindVertexArray(0);
}
Esempio n. 3
0
void sprite_draw(struct sprite* s, float cx, float cy, float angle)
{
	float w2 = s->width/2;
	float h2 = s->height/2;
	int i;
	float sint = sin(torad(angle));
	float cost = cos(torad(angle));
	struct matrix2d rotation = { {
		{cost, -sint},
		{sint, cost} }};
	struct vector2d v[4] = { {{-w2, -h2}}, {{-w2, h2}}, {{w2, h2}}, {{w2,-h2}} };

	for(i=0; i<4;i++)
	{
		v[i] = matrix_vec_mult(rotation.m, v[i].vec);
	}

	for(i=0; i<4;i++)
	{
		v[i].vec[0] += cx;
		v[i].vec[1] += cy;
	}

	gl_bind_texture(s->texture);

	gl_vertex(v[0].vec[0], v[0].vec[1], 0, 0,0);
	gl_vertex(v[1].vec[0], v[1].vec[1], 0, 0,1);
	gl_vertex(v[2].vec[0], v[2].vec[1], 0, 1,1);
	gl_vertex(v[3].vec[0], v[3].vec[1], 0, 1,0);
}
Esempio n. 4
0
 render_technique_ss::render_technique_ss(ui32 width, ui32 height, const std::string& name, const std::shared_ptr<material>& material) :
 render_technique_base(width, height, name, 0),
 m_material(material)
 {
     ui32 color_attachment_id;
     gl_create_textures(1, &color_attachment_id);
     gl_bind_texture(GL_TEXTURE_2D, color_attachment_id);
     gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     gl_texture_image2d(GL_TEXTURE_2D, 0, GL_RGBA, m_frame_width, m_frame_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
     
     gl_create_frame_buffers(1, &m_frame_buffer);
     gl_bind_frame_buffer(GL_FRAMEBUFFER, m_frame_buffer);
     gl_attach_frame_buffer_texture2d(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_attachment_id, 0);
     
     assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
     
     std::string color_attachment_guid = m_name;
     color_attachment_guid.append(".color");
     m_color_attachment_texture = texture::construct(color_attachment_guid,
                                                     color_attachment_id,
                                                     m_frame_width,
                                                     m_frame_height);
     
     m_color_attachment_texture->set_wrap_mode(GL_CLAMP_TO_EDGE);
     
     m_quad = mesh_constructor::create_screen_quad();
 }
Esempio n. 5
0
void device_load_texture(gs_device_t *device, gs_texture_t *tex, int unit)
{
	struct gs_shader_param *param;
	struct gs_sampler_state *sampler;
	struct gs_texture *cur_tex = device->cur_textures[unit];

	/* need a pixel shader to properly bind textures */
	if (!device->cur_pixel_shader)
		tex = NULL;

	if (cur_tex == tex)
		return;

	if (!gl_active_texture(GL_TEXTURE0 + unit))
		goto fail;

	/* the target for the previous text may not be the same as the
	 * next texture, so unbind the previous texture first to be safe */
	if (cur_tex && (!tex || cur_tex->gl_target != tex->gl_target))
		gl_bind_texture(cur_tex->gl_target, 0);

	device->cur_textures[unit] = tex;
	param = get_texture_param(device, unit);
	if (!param)
		return;

	param->texture = tex;

	if (!tex)
		return;

	// texelFetch doesn't need a sampler
	if (param->sampler_id != (size_t)-1)
		sampler = device->cur_samplers[param->sampler_id];
	else
		sampler = NULL;

	if (!gl_bind_texture(tex->gl_target, tex->texture))
		goto fail;
	if (sampler && !load_texture_sampler(tex, sampler))
		goto fail;

	return;

fail:
	blog(LOG_ERROR, "device_load_texture (GL) failed");
}
/**
 * gst_vaapi_window_glx_put_texture:
 * @window: a #GstVaapiWindowGLX
 * @texture: a #GstVaapiTexture
 * @src_rect: the sub-rectangle of the source texture to
 *   extract and process. If %NULL, the entire texture will be used.
 * @dst_rect: the sub-rectangle of the destination
 *   window into which the texture is rendered. If %NULL, the entire
 *   window will be used.
 *
 * Renders the @texture region specified by @src_rect into the @window
 * region specified by @dst_rect.
 *
 * NOTE: only GL_TEXTURE_2D textures are supported at this time.
 *
 * Return value: %TRUE on success
 */
gboolean
gst_vaapi_window_glx_put_texture (GstVaapiWindowGLX * window,
    GstVaapiTexture * texture,
    const GstVaapiRectangle * src_rect, const GstVaapiRectangle * dst_rect)
{
  GstVaapiRectangle tmp_src_rect, tmp_dst_rect;
  GLTextureState ts;
  GLenum tex_target;
  GLuint tex_id;
  guint tex_width, tex_height;
  guint win_width, win_height;

  g_return_val_if_fail (GST_VAAPI_IS_WINDOW_GLX (window), FALSE);
  g_return_val_if_fail (texture != NULL, FALSE);

  gst_vaapi_texture_get_size (texture, &tex_width, &tex_height);
  fill_rect (&tmp_src_rect, src_rect, tex_width, tex_height);
  src_rect = &tmp_src_rect;

  gst_vaapi_window_get_size (GST_VAAPI_WINDOW (window), &win_width,
      &win_height);
  fill_rect (&tmp_dst_rect, dst_rect, win_width, win_height);
  dst_rect = &tmp_dst_rect;

  /* XXX: only GL_TEXTURE_2D textures are supported at this time */
  tex_target = gst_vaapi_texture_get_target (texture);
  if (tex_target != GL_TEXTURE_2D)
    return FALSE;

  tex_id = gst_vaapi_texture_get_id (texture);
  if (!gl_bind_texture (&ts, tex_target, tex_id))
    return FALSE;
  glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
  glPushMatrix ();
  glTranslatef ((GLfloat) dst_rect->x, (GLfloat) dst_rect->y, 0.0f);
  glBegin (GL_QUADS);
  {
    const float tx1 = (float) src_rect->x / tex_width;
    const float tx2 = (float) (src_rect->x + src_rect->width) / tex_width;
    const float ty1 = (float) src_rect->y / tex_height;
    const float ty2 = (float) (src_rect->y + src_rect->height) / tex_height;
    const guint w = dst_rect->width;
    const guint h = dst_rect->height;
    glTexCoord2f (tx1, ty1);
    glVertex2i (0, 0);
    glTexCoord2f (tx1, ty2);
    glVertex2i (0, h);
    glTexCoord2f (tx2, ty2);
    glVertex2i (w, h);
    glTexCoord2f (tx2, ty1);
    glVertex2i (w, 0);
  }
  glEnd ();
  glPopMatrix ();
  gl_unbind_texture (&ts);
  return TRUE;
}
Esempio n. 7
0
    render_target::render_target(const graphics_context_shared_ptr& graphics_context, GLint format,
                                 const glm::ivec2& size, const texture_shared_ptr& custom_attachment) :
    m_graphics_context(graphics_context),
    m_size(size),
    m_format(format),
    m_is_custom_color_attachment(custom_attachment != nullptr)
    {
        if(!m_is_custom_color_attachment)
        {
            gl_create_textures(1, &m_color_attachment);
            gl_bind_texture(GL_TEXTURE_2D, m_color_attachment);
            gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
            gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            gl_texture_parameter_i(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
            gl_texture_image2d(GL_TEXTURE_2D, 0, format,
                               m_size.x,
                               m_size.y,
                               0, format, GL_UNSIGNED_BYTE, NULL);
        }
        else
        {
            m_color_attachment = custom_attachment->get_texture_id();
        }
        
        gl_create_render_buffers(1, &m_depth_attachment);
        gl_bind_render_buffer(GL_RENDERBUFFER, m_depth_attachment);
        gl_create_render_buffer_storage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16,
                                        m_size.x,
                                        m_size.y);
        
        gl_create_frame_buffers(1, &m_frame_buffer);
        gl_bind_frame_buffer(GL_FRAMEBUFFER, m_frame_buffer);
        gl_attach_frame_buffer_texture2d(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_color_attachment, 0);
        gl_attach_frame_buffer_render_buffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depth_attachment);
        assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
        
#if defined(__PBO__)
        
        ui32 size = m_size.x * m_size.y;
        if(m_format == GL_RGBA)
        {
            size *= 4;
        }
        else if(m_format == GL_RGB)
        {
            size *= 3;
        }
        
        gl_create_buffers(1, &m_pixel_buffer);
        gl_bind_buffer(GL_PIXEL_PACK_BUFFER, m_pixel_buffer);
        gl_push_buffer_data(GL_PIXEL_PACK_BUFFER, size, NULL, GL_STREAM_READ);
        gl_bind_buffer(GL_PIXEL_PACK_BUFFER, 0);
        
#endif
    }
Esempio n. 8
0
void device_load_texture(device_t device, texture_t tex, int unit)
{
	struct shader_param *param;
	struct gs_sampler_state *sampler;
	struct gs_texture *cur_tex = device->cur_textures[unit];

	/* need a pixel shader to properly bind textures */
	if (!device->cur_pixel_shader)
		tex = NULL;

	if (cur_tex == tex)
		return;

	if (!gl_active_texture(GL_TEXTURE0 + unit))
		goto fail;

	if (cur_tex && cur_tex->gl_target != tex->gl_target)
		gl_bind_texture(cur_tex->gl_target, 0);


	device->cur_textures[unit] = tex;
	param = get_texture_param(device, unit);
	if (!param)
		return;

	param->texture = tex;

	if (!tex)
		return;

	sampler = device->cur_samplers[param->sampler_id];

	if (!gl_bind_texture(tex->gl_target, tex->texture))
		goto fail;
	if (sampler && !load_texture_sampler(tex, sampler))
		goto fail;

	return;

fail:
	blog(LOG_ERROR, "device_load_texture (GL) failed");
}
Esempio n. 9
0
static void clear_textures(struct gs_device *device)
{
	GLenum i;
	for (i = 0; i < GS_MAX_TEXTURES; i++) {
		if (device->cur_textures[i]) {
			gl_active_texture(GL_TEXTURE0 + i);
			gl_bind_texture(device->cur_textures[i]->gl_target, 0);
			device->cur_textures[i] = NULL;
		}
	}
}
Esempio n. 10
0
static inline bool upload_texture_cube(struct gs_texture_cube *tex,
		const uint8_t **data)
{
	uint32_t row_size   = tex->size * gs_get_format_bpp(tex->base.format);
	uint32_t tex_size   = tex->size * row_size / 8;
	uint32_t num_levels = tex->base.levels;
	bool     compressed = gs_is_compressed_format(tex->base.format);
	GLenum   gl_type    = get_gl_format_type(tex->base.format);
	bool     success    = true;
	uint32_t i;

	if (!num_levels)
		num_levels = gs_get_total_levels(tex->size, tex->size);

	for (i = 0; i < 6; i++) {
		GLenum target = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i;

		if (!gl_bind_texture(target, tex->base.texture))
			success = false;

		if (!gl_init_face(target, gl_type, num_levels,
					tex->base.gl_format,
					tex->base.gl_internal_format,
					compressed, tex->size, tex->size,
					tex_size, &data))
			success = false;

		if (!gl_bind_texture(target, 0))
			success = false;

		if (data)
			data++;
	}

	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_LEVEL, num_levels);
	if (!gl_success("glTexParameteri"))
		success = false;

	return success;
}
Esempio n. 11
0
static bool gl_init_stage_surface(struct gs_stage_surface *surf)
{
	bool success = true;

	if (!gl_gen_textures(1, &surf->texture))
		return false;
	if (!gl_bind_texture(GL_TEXTURE_2D, surf->texture))
		return false;

	if (!gl_init_face(GL_TEXTURE_2D, surf->gl_type, 1, surf->gl_format,
			surf->gl_internal_format, false,
			surf->width, surf->height, 0, NULL))
		success = false;

	if (!gl_bind_texture(GL_TEXTURE_2D, 0))
		success = false;

	if (success)
		success = create_pixel_pack_buffer(surf);

	return success;
}
/**
 * gst_vaapi_texture_glx_new_wrapped:
 * @display: a #GstVaapiDisplay
 * @texture_id: the foreign GL texture name to use
 * @target: the target to which the texture is bound
 * @format: the format of the pixel data
 *
 * Creates a texture from an existing GL texture, with the specified
 * @target and @format. Note that only GL_TEXTURE_2D @target and
 * GL_RGBA or GL_BGRA formats are supported at this time. The
 * dimensions will be retrieved from the @texture_id.
 *
 * The application shall maintain the live GL context itself. That is,
 * gst_vaapi_window_glx_make_current() must be called beforehand, or
 * any other function like glXMakeCurrent() if the context is managed
 * outside of this library.
 *
 * Return value: the newly created #GstVaapiTexture object
 */
GstVaapiTexture *
gst_vaapi_texture_glx_new_wrapped (GstVaapiDisplay * display,
    guint texture_id, guint target, guint format)
{
  guint width, height, border_width = 0;
  GLTextureState ts = { 0, };
  gboolean success;
  GstVaapiGLApi gl_api;

  g_return_val_if_fail (GST_VAAPI_IS_DISPLAY_GLX (display), NULL);
  g_return_val_if_fail (texture_id != GL_NONE, NULL);
  g_return_val_if_fail (target == GL_TEXTURE_2D, NULL);
  g_return_val_if_fail (format == GL_RGBA || format == GL_BGRA, NULL);

  gl_api = gl_get_curent_api_once ();
  if (gl_api != GST_VAAPI_GL_API_OPENGL && gl_api != GST_VAAPI_GL_API_OPENGL3)
    return NULL;

  /* Check texture dimensions */
  GST_VAAPI_DISPLAY_LOCK (display);
  if (gl_api == GST_VAAPI_GL_API_OPENGL)
    success = gl_bind_texture (&ts, target, texture_id);
  else
    success = gl3_bind_texture_2d (&ts, target, texture_id);

  if (success) {
    if (!gl_get_texture_param (target, GL_TEXTURE_WIDTH, &width) ||
        !gl_get_texture_param (target, GL_TEXTURE_HEIGHT, &height))
      success = FALSE;
    if (success && gl_api == GST_VAAPI_GL_API_OPENGL)
      success = gl_get_texture_param (target, GL_TEXTURE_BORDER, &border_width);
    gl_unbind_texture (&ts);
  }
  GST_VAAPI_DISPLAY_UNLOCK (display);
  if (!success)
    return NULL;

  width -= 2 * border_width;
  height -= 2 * border_width;
  g_return_val_if_fail (width > 0, NULL);
  g_return_val_if_fail (height > 0, NULL);

  return gst_vaapi_texture_new_internal (GST_VAAPI_TEXTURE_CLASS
      (gst_vaapi_texture_glx_class ()), display, texture_id, target, format,
      width, height);
}
Esempio n. 13
0
void gl_draw_text(Scene_Camera* camera, Font* font, UChar* text, GLfloat size) {
    glBindVertexArray(font->quad->vao);
    glUseProgram(font->quad->shader->id);
    //TODO: this bugs out when I enable depth-testing due to z-fighting
    //on adjacent characters, I can probably fix it with blend mode?
    glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE);
    gl_bind_texture(font->quad->shader->id, font->page->id, 0, "diffuse");

    int32_t length = u_strlen(text); UChar32 character;
    for(int32_t i = 0; i < length; i++) {
        U16_GET_UNSAFE(text, i, character);
        gl_draw_font_glyph(camera, font, character, size);
    }

    glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE);
    glBindVertexArray(0);
    glUseProgram(0);
}
 void texture_commiter_png::commit(const resource_transfering_data_shared_ptr& transfering_data)
 {
     m_status = e_commiter_status_in_progress;
     assert(m_resource != nullptr);
     
     ui32 texture_id = 0;
     gl_create_textures(1, &texture_id);
     gl_bind_texture(GL_TEXTURE_2D, texture_id);
     
     texture_transfering_data_shared_ptr texture_transfering_data = std::static_pointer_cast<gb::texture_transfering_data>(transfering_data);
     
     gl_texture_image2d(GL_TEXTURE_2D, 0, texture_transfering_data->m_format,
                        texture_transfering_data->m_width, texture_transfering_data->m_height,
                        0, texture_transfering_data->m_format, GL_UNSIGNED_BYTE, (GLvoid*)&texture_transfering_data->m_data[0]);
     gl_generate_mipmap(GL_TEXTURE_2D);
 
     m_status = e_commiter_status_success;
     
     texture_transfering_data->m_texture_id = texture_id;
     resource_commiter::on_transfering_data_commited(texture_transfering_data);
 }
Esempio n. 15
0
static void gl_create_fbo_texture(gl_t *gl,
      void *chain_data, unsigned i, GLuint texture)
{
   GLenum mag_filter, wrap_enum;
   video_shader_ctx_filter_t filter_type;
   video_shader_ctx_wrap_t wrap = {0};
   bool fp_fbo                  = false;
   bool smooth                  = false;
   gl2_renderchain_t *chain     = (gl2_renderchain_t*)chain_data;
   settings_t *settings         = config_get_ptr();
   GLuint base_filt             = settings->bools.video_smooth ? GL_LINEAR : GL_NEAREST;
   GLuint base_mip_filt         = settings->bools.video_smooth ?
      GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST;
   unsigned mip_level           = i + 2;
   bool mipmapped               = video_shader_driver_mipmap_input(&mip_level);
   GLenum min_filter            = mipmapped ? base_mip_filt : base_filt;

   filter_type.index            = i + 2;
   filter_type.smooth           = &smooth;

   if (video_shader_driver_filter_type(&filter_type))
   {
      min_filter = mipmapped ? (smooth ?
            GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST)
         : (smooth ? GL_LINEAR : GL_NEAREST);
   }

   mag_filter = min_filter_to_mag(min_filter);
   wrap.idx   = i + 2;

   video_shader_driver_wrap_type(&wrap);

   wrap_enum  = gl_wrap_type_to_enum(wrap.type);

   gl_bind_texture(texture, wrap_enum, mag_filter, min_filter);

   fp_fbo   = chain->fbo_scale[i].fp_fbo;

   if (fp_fbo)
   {
      if (!chain->has_fp_fbo)
         RARCH_ERR("[GL]: Floating-point FBO was requested, but is not supported. Falling back to UNORM. Result may band/clip/etc.!\n");
   }

#if !defined(HAVE_OPENGLES2)
   if (fp_fbo && chain->has_fp_fbo)
   {
      RARCH_LOG("[GL]: FBO pass #%d is floating-point.\n", i);
      gl_load_texture_image(GL_TEXTURE_2D, 0, GL_RGBA32F,
         gl->fbo_rect[i].width, gl->fbo_rect[i].height,
         0, GL_RGBA, GL_FLOAT, NULL);
   }
   else
#endif
   {
#ifndef HAVE_OPENGLES
      bool srgb_fbo = chain->fbo_scale[i].srgb_fbo;

      if (!fp_fbo && srgb_fbo)
      {
         if (!chain->has_srgb_fbo)
               RARCH_ERR("[GL]: sRGB FBO was requested, but it is not supported. Falling back to UNORM. Result may have banding!\n");
      }

      if (settings->bools.video_force_srgb_disable)
         srgb_fbo = false;

      if (srgb_fbo && chain->has_srgb_fbo)
      {
         RARCH_LOG("[GL]: FBO pass #%d is sRGB.\n", i);
#ifdef HAVE_OPENGLES2
         /* EXT defines are same as core GLES3 defines,
          * but GLES3 variant requires different arguments. */
         glTexImage2D(GL_TEXTURE_2D,
               0, GL_SRGB_ALPHA_EXT,
               gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0,
               chain->has_srgb_fbo_gles3 ? GL_RGBA : GL_SRGB_ALPHA_EXT,
               GL_UNSIGNED_BYTE, NULL);
#else
         gl_load_texture_image(GL_TEXTURE_2D,
            0, GL_SRGB8_ALPHA8,
            gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0,
            GL_RGBA, GL_UNSIGNED_BYTE, NULL);
#endif
      }
      else
#endif
      {
#if defined(HAVE_OPENGLES2) || defined(HAVE_PSGL)
         glTexImage2D(GL_TEXTURE_2D,
               0, GL_RGBA,
               gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0,
               GL_RGBA, GL_UNSIGNED_BYTE, NULL);
#else
         /* Avoid potential performance
          * reductions on particular platforms. */
         gl_load_texture_image(GL_TEXTURE_2D,
            0, RARCH_GL_INTERNAL_FORMAT32,
            gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0,
            RARCH_GL_TEXTURE_TYPE32, RARCH_GL_FORMAT32, NULL);
#endif
      }
   }
}
Esempio n. 16
0
void gl_grop_handler(struct groprender *r, struct gropnode *n) {
  struct glbitmap *glb;
  GLfloat vector[4];

  switch (n->type) {

  case PG_GROP_GL_BINDTEXTURE:
    if (!iserror(rdhandle((void**)&glb,PG_TYPE_BITMAP,-1,n->param[0])) && glb)
      gl_bind_texture(glb);
    break;

  case PG_GROP_GL_ENABLE:
    glEnable(n->param[0]);
    break;

  case PG_GROP_GL_DISABLE:
    glDisable(n->param[0]);
    break;

  case PG_GROP_GL_DEPTHFUNC:
    glDepthFunc(n->param[0]);
    break;

  case PG_GROP_GL_SHADEMODEL:
    glShadeModel(n->param[0]);
    break;

  case PG_GROP_GL_MATRIXMODE:
    glMatrixMode(n->param[0]);
    break;

  case PG_GROP_GL_LOADIDENTITY:
    glLoadIdentity();
    break;

  case PG_GROP_GL_PUSHMATRIX:
    glPushMatrix();
    break;

  case PG_GROP_GL_POPMATRIX:
    glPopMatrix();
    break;

  case PG_GROP_GL_TRANSLATEF:
    glTranslatef(UNFIX(n->param[0]),
		 UNFIX(n->param[1]),
		 UNFIX(n->param[2]));
    break;

  case PG_GROP_GL_ROTATEF:
    glRotatef(UNFIX16(n->r.x,n->r.y),
	      UNFIX(n->param[0]),
	      UNFIX(n->param[1]),
	      UNFIX(n->param[2]));
    break;

  case PG_GROP_GL_SCALEF:
    glScalef(UNFIX(n->param[0]),
	     UNFIX(n->param[1]),
	     UNFIX(n->param[2]));
    break;

  case PG_GROP_GL_BEGIN: 
    glBegin(n->param[0]);
    break;

  case PG_GROP_GL_TEXCOORD2F:
    glTexCoord2f(UNFIX(n->param[0]),
		 UNFIX(n->param[1]));
    break;

  case PG_GROP_GL_VERTEX3F:
    glVertex3f(UNFIX(n->param[0]),
	       UNFIX(n->param[1]),
	       UNFIX(n->param[2]));
    break;

  case PG_GROP_GL_END:
    glEnd();
    break;

  case PG_GROP_GL_HINT:
    glHint(n->param[0],n->param[1]);
    break;

  case PG_GROP_GL_NORMAL3F:
    glNormal3f(UNFIX(n->param[0]),
	       UNFIX(n->param[1]),
	       UNFIX(n->param[2]));    
    break;

  case PG_GROP_GL_LIGHTFV:
    vector[0] = UNFIX(n->param[0]);
    vector[1] = UNFIX(n->param[1]);
    vector[2] = UNFIX(n->param[2]);
    vector[3] = UNFIX16(n->r.w,n->r.h);
    glLightfv(n->r.x,n->r.y,(const GLfloat *)&vector);
    break;

  case PG_GROP_GL_MATERIALFV:
    vector[0] = UNFIX(n->param[0]);
    vector[1] = UNFIX(n->param[1]);
    vector[2] = UNFIX(n->param[2]);
    vector[3] = UNFIX16(n->r.w,n->r.h);
    glMaterialfv(n->r.x,n->r.y,(const GLfloat *)&vector);
    break;

  case PG_GROP_GL_TEXGENFV:
    vector[0] = UNFIX(n->param[0]);
    vector[1] = UNFIX(n->param[1]);
    vector[2] = UNFIX(n->param[2]);
    vector[3] = UNFIX16(n->r.w,n->r.h);
    glTexGenfv(n->r.x,n->r.y,(const GLfloat *)&vector);
    break;

  case PG_GROP_GL_TEXGENI:
    glTexGeni(n->param[0], n->param[1], n->param[2]);
    break;

  case PG_GROP_GL_MATERIALI:
    glMateriali(n->param[0], n->param[1], n->param[2]);
    break;

  case PG_GROP_GL_MATRIX_PIXELCOORD:
    gl_matrix_pixelcoord();
    break;

  case PG_GROP_GL_COLOR:
    gl_color(n->param[0]);
    break;

  case PG_GROP_GL_BLENDFUNC:
    glBlendFunc(n->param[0],n->param[1]);
    break;

  case PG_GROP_GL_FEEDBACK:
    gl_feedback(n->r.x, n->r.y, n->r.w, n->r.h,
		r->lgop, n->param[0], n->param[1],
		(n->param[2]>>16) & 0xFFFF, (n->param[2] & 0xFFFF));
    break;

  case PG_GROP_GL_TEXPARAMETERI:
    glTexParameteri(n->param[0],n->param[1],n->param[2]);
    break;

  }
}