mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
intel: Put the constant texcoords used in metaops into a vbo.
Make this be its own function for setup/teardown of the binding of these texcoords. No performance difference in the engine demo (I just felt dirty not using a VBO for this), and I think it should be more resilient to interference from current GL state.
This commit is contained in:
parent
f09e5a5b63
commit
b6e94f71c2
5 changed files with 102 additions and 40 deletions
|
|
@ -161,12 +161,20 @@ struct intel_context
|
|||
struct {
|
||||
struct gl_fragment_program *bitmap_fp;
|
||||
struct gl_vertex_program *passthrough_vp;
|
||||
struct gl_buffer_object *texcoord_vbo;
|
||||
|
||||
struct gl_fragment_program *saved_fp;
|
||||
GLboolean saved_fp_enable;
|
||||
struct gl_vertex_program *saved_vp;
|
||||
GLboolean saved_vp_enable;
|
||||
|
||||
GLboolean saved_texcoord_enable;
|
||||
struct gl_buffer_object *saved_array_vbo, *saved_texcoord_vbo;
|
||||
GLenum saved_texcoord_type;
|
||||
GLsizei saved_texcoord_size, saved_texcoord_stride;
|
||||
const void *saved_texcoord_ptr;
|
||||
int saved_active_texture;
|
||||
|
||||
GLint saved_vp_x, saved_vp_y;
|
||||
GLsizei saved_vp_width, saved_vp_height;
|
||||
GLenum saved_matrix_mode;
|
||||
|
|
|
|||
|
|
@ -27,9 +27,12 @@
|
|||
|
||||
#include "main/enums.h"
|
||||
#include "main/state.h"
|
||||
#include "main/bufferobj.h"
|
||||
#include "main/context.h"
|
||||
#include "main/enable.h"
|
||||
#include "main/matrix.h"
|
||||
#include "main/texstate.h"
|
||||
#include "main/varray.h"
|
||||
#include "main/viewport.h"
|
||||
#include "swrast/swrast.h"
|
||||
#include "shader/arbprogram.h"
|
||||
|
|
@ -334,6 +337,85 @@ intel_meta_restore_fragment_program(struct intel_context *intel)
|
|||
_mesa_Disable(GL_FRAGMENT_PROGRAM_ARB);
|
||||
}
|
||||
|
||||
static const float default_texcoords[4][2] = { { 0.0, 0.0 },
|
||||
{ 1.0, 0.0 },
|
||||
{ 1.0, 1.0 },
|
||||
{ 0.0, 1.0 } };
|
||||
|
||||
void
|
||||
intel_meta_set_default_texrect(struct intel_context *intel)
|
||||
{
|
||||
GLcontext *ctx = &intel->ctx;
|
||||
struct gl_client_array *old_texcoord_array;
|
||||
|
||||
intel->meta.saved_active_texture = ctx->Texture.CurrentUnit;
|
||||
if (intel->meta.saved_array_vbo == NULL) {
|
||||
_mesa_reference_buffer_object(ctx, &intel->meta.saved_array_vbo,
|
||||
ctx->Array.ArrayBufferObj);
|
||||
}
|
||||
|
||||
old_texcoord_array = &ctx->Array.ArrayObj->TexCoord[0];
|
||||
intel->meta.saved_texcoord_type = old_texcoord_array->Type;
|
||||
intel->meta.saved_texcoord_size = old_texcoord_array->Size;
|
||||
intel->meta.saved_texcoord_stride = old_texcoord_array->Stride;
|
||||
intel->meta.saved_texcoord_enable = old_texcoord_array->Enabled;
|
||||
intel->meta.saved_texcoord_ptr = old_texcoord_array->Ptr;
|
||||
_mesa_reference_buffer_object(ctx, &intel->meta.saved_texcoord_vbo,
|
||||
old_texcoord_array->BufferObj);
|
||||
|
||||
_mesa_ClientActiveTextureARB(GL_TEXTURE0);
|
||||
|
||||
if (intel->meta.texcoord_vbo == NULL) {
|
||||
GLuint vbo_name;
|
||||
|
||||
_mesa_GenBuffersARB(1, &vbo_name);
|
||||
_mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_name);
|
||||
_mesa_BufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(default_texcoords),
|
||||
default_texcoords, GL_STATIC_DRAW_ARB);
|
||||
_mesa_reference_buffer_object(ctx, &intel->meta.texcoord_vbo,
|
||||
ctx->Array.ArrayBufferObj);
|
||||
} else {
|
||||
_mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB,
|
||||
intel->meta.texcoord_vbo->Name);
|
||||
}
|
||||
_mesa_TexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), NULL);
|
||||
|
||||
_mesa_Enable(GL_TEXTURE_COORD_ARRAY);
|
||||
}
|
||||
|
||||
void
|
||||
intel_meta_restore_texcoords(struct intel_context *intel)
|
||||
{
|
||||
GLcontext *ctx = &intel->ctx;
|
||||
|
||||
/* Restore the old TexCoordPointer */
|
||||
if (intel->meta.saved_texcoord_vbo) {
|
||||
_mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB,
|
||||
intel->meta.saved_texcoord_vbo->Name);
|
||||
_mesa_reference_buffer_object(ctx, &intel->meta.saved_texcoord_vbo, NULL);
|
||||
} else {
|
||||
_mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
}
|
||||
|
||||
_mesa_TexCoordPointer(intel->meta.saved_texcoord_size,
|
||||
intel->meta.saved_texcoord_type,
|
||||
intel->meta.saved_texcoord_stride,
|
||||
intel->meta.saved_texcoord_ptr);
|
||||
if (!intel->meta.saved_texcoord_enable)
|
||||
_mesa_Disable(GL_TEXTURE_COORD_ARRAY);
|
||||
|
||||
_mesa_ClientActiveTextureARB(GL_TEXTURE0 +
|
||||
intel->meta.saved_active_texture);
|
||||
|
||||
if (intel->meta.saved_array_vbo) {
|
||||
_mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB,
|
||||
intel->meta.saved_array_vbo->Name);
|
||||
_mesa_reference_buffer_object(ctx, &intel->meta.saved_array_vbo, NULL);
|
||||
} else {
|
||||
_mesa_BindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
intelInitPixelFuncs(struct dd_function_table *functions)
|
||||
{
|
||||
|
|
@ -355,5 +437,6 @@ intel_free_pixel_state(struct intel_context *intel)
|
|||
|
||||
_mesa_reference_vertprog(ctx, &intel->meta.passthrough_vp, NULL);
|
||||
_mesa_reference_fragprog(ctx, &intel->meta.bitmap_fp, NULL);
|
||||
_mesa_reference_buffer_object(ctx, &intel->meta.texcoord_vbo, NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,9 @@ void intel_meta_set_fragment_program(struct intel_context *intel,
|
|||
const char *prog_string);
|
||||
void intel_meta_restore_fragment_program(struct intel_context *intel);
|
||||
void intel_free_pixel_state(struct intel_context *intel);
|
||||
void intel_meta_set_default_texrect(struct intel_context *intel);
|
||||
void intel_meta_set_default_texrect(struct intel_context *intel);
|
||||
void intel_meta_restore_texcoords(struct intel_context *intel);
|
||||
|
||||
GLboolean intel_check_blit_fragment_ops(GLcontext * ctx,
|
||||
GLboolean src_alpha_is_one);
|
||||
|
|
|
|||
|
|
@ -360,7 +360,6 @@ intel_texture_bitmap(GLcontext * ctx,
|
|||
"END\n";
|
||||
GLuint texname;
|
||||
GLfloat vertices[4][4];
|
||||
GLfloat texcoords[4][2];
|
||||
GLint old_active_texture;
|
||||
GLubyte *unpacked_bitmap;
|
||||
GLubyte *a8_bitmap;
|
||||
|
|
@ -485,22 +484,12 @@ intel_texture_bitmap(GLcontext * ctx,
|
|||
vertices[3][2] = dst_z;
|
||||
vertices[3][3] = 1.0;
|
||||
|
||||
texcoords[0][0] = 0.0;
|
||||
texcoords[0][1] = 0.0;
|
||||
texcoords[1][0] = 1.0;
|
||||
texcoords[1][1] = 0.0;
|
||||
texcoords[2][0] = 1.0;
|
||||
texcoords[2][1] = 1.0;
|
||||
texcoords[3][0] = 0.0;
|
||||
texcoords[3][1] = 1.0;
|
||||
|
||||
_mesa_VertexPointer(4, GL_FLOAT, 4 * sizeof(GLfloat), &vertices);
|
||||
_mesa_ClientActiveTextureARB(GL_TEXTURE0);
|
||||
_mesa_TexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &texcoords);
|
||||
_mesa_Enable(GL_VERTEX_ARRAY);
|
||||
_mesa_Enable(GL_TEXTURE_COORD_ARRAY);
|
||||
intel_meta_set_default_texrect(intel);
|
||||
CALL_DrawArrays(ctx->Exec, (GL_TRIANGLE_FAN, 0, 4));
|
||||
|
||||
intel_meta_restore_texcoords(intel);
|
||||
intel_meta_restore_transform(intel);
|
||||
intel_meta_restore_fragment_program(intel);
|
||||
intel_meta_restore_vertex_program(intel);
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@ intel_texture_drawpixels(GLcontext * ctx,
|
|||
struct intel_context *intel = intel_context(ctx);
|
||||
GLuint texname;
|
||||
GLfloat vertices[4][4];
|
||||
GLfloat texcoords[4][2];
|
||||
GLfloat z;
|
||||
GLint old_active_texture;
|
||||
GLenum internalFormat;
|
||||
|
|
@ -169,22 +168,13 @@ intel_texture_drawpixels(GLcontext * ctx,
|
|||
vertices[3][2] = z;
|
||||
vertices[3][3] = 1.0;
|
||||
|
||||
texcoords[0][0] = 0.0;
|
||||
texcoords[0][1] = 0.0;
|
||||
texcoords[1][0] = 1.0;
|
||||
texcoords[1][1] = 0.0;
|
||||
texcoords[2][0] = 1.0;
|
||||
texcoords[2][1] = 1.0;
|
||||
texcoords[3][0] = 0.0;
|
||||
texcoords[3][1] = 1.0;
|
||||
|
||||
_mesa_VertexPointer(4, GL_FLOAT, 4 * sizeof(GLfloat), &vertices);
|
||||
_mesa_ClientActiveTextureARB(GL_TEXTURE0);
|
||||
_mesa_TexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &texcoords);
|
||||
_mesa_Enable(GL_VERTEX_ARRAY);
|
||||
_mesa_Enable(GL_TEXTURE_COORD_ARRAY);
|
||||
intel_meta_set_default_texrect(intel);
|
||||
|
||||
CALL_DrawArrays(ctx->Exec, (GL_TRIANGLE_FAN, 0, 4));
|
||||
|
||||
intel_meta_restore_texcoords(intel);
|
||||
intel_meta_restore_transform(intel);
|
||||
|
||||
_mesa_ActiveTextureARB(GL_TEXTURE0_ARB + old_active_texture);
|
||||
|
|
@ -208,7 +198,6 @@ intel_stencil_drawpixels(GLcontext * ctx,
|
|||
struct intel_context *intel = intel_context(ctx);
|
||||
GLuint texname, rb_name, fb_name, old_fb_name;
|
||||
GLfloat vertices[4][2];
|
||||
GLfloat texcoords[4][2];
|
||||
struct intel_renderbuffer *irb;
|
||||
struct intel_renderbuffer *depth_irb;
|
||||
struct gl_renderbuffer *rb;
|
||||
|
|
@ -343,7 +332,6 @@ intel_stencil_drawpixels(GLcontext * ctx,
|
|||
_mesa_free(stencil_pixels);
|
||||
|
||||
intel_meta_set_passthrough_transform(intel);
|
||||
|
||||
vertices[0][0] = x;
|
||||
vertices[0][1] = y;
|
||||
vertices[1][0] = x + width * ctx->Pixel.ZoomX;
|
||||
|
|
@ -353,22 +341,13 @@ intel_stencil_drawpixels(GLcontext * ctx,
|
|||
vertices[3][0] = x;
|
||||
vertices[3][1] = y + height * ctx->Pixel.ZoomY;
|
||||
|
||||
texcoords[0][0] = 0.0;
|
||||
texcoords[0][1] = 0.0;
|
||||
texcoords[1][0] = 1.0;
|
||||
texcoords[1][1] = 0.0;
|
||||
texcoords[2][0] = 1.0;
|
||||
texcoords[2][1] = 1.0;
|
||||
texcoords[3][0] = 0.0;
|
||||
texcoords[3][1] = 1.0;
|
||||
|
||||
_mesa_VertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &vertices);
|
||||
_mesa_ClientActiveTextureARB(GL_TEXTURE0);
|
||||
_mesa_TexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &texcoords);
|
||||
_mesa_Enable(GL_VERTEX_ARRAY);
|
||||
_mesa_Enable(GL_TEXTURE_COORD_ARRAY);
|
||||
intel_meta_set_default_texrect(intel);
|
||||
|
||||
CALL_DrawArrays(ctx->Exec, (GL_TRIANGLE_FAN, 0, 4));
|
||||
|
||||
intel_meta_restore_texcoords(intel);
|
||||
intel_meta_restore_transform(intel);
|
||||
|
||||
_mesa_ActiveTextureARB(GL_TEXTURE0_ARB + old_active_texture);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue