summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_draw_upload.c51
1 files changed, 22 insertions, 29 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_draw_upload.c b/src/mesa/drivers/dri/i965/brw_draw_upload.c
index 78ff61fe173..ed3b37864ad 100644
--- a/src/mesa/drivers/dri/i965/brw_draw_upload.c
+++ b/src/mesa/drivers/dri/i965/brw_draw_upload.c
@@ -223,16 +223,19 @@ static GLuint byte_types_scale[5] = {
* Format will be GL_RGBA or possibly GL_BGRA for GLubyte[4] color arrays.
*/
static unsigned
-get_surface_type(struct intel_context *intel, GLenum type, GLuint size,
- GLenum format, bool normalized, bool integer)
+get_surface_type(struct intel_context *intel,
+ const struct gl_client_array *glarray)
{
+ int size = glarray->Size;
+
if (unlikely(INTEL_DEBUG & DEBUG_VERTS))
printf("type %s size %d normalized %d\n",
- _mesa_lookup_enum_by_nr(type), size, normalized);
+ _mesa_lookup_enum_by_nr(glarray->Type),
+ glarray->Size, glarray->Normalized);
- if (integer) {
- assert(format == GL_RGBA); /* sanity check */
- switch (type) {
+ if (glarray->Integer) {
+ assert(glarray->Format == GL_RGBA); /* sanity check */
+ switch (glarray->Type) {
case GL_INT: return int_types_direct[size];
case GL_SHORT: return short_types_direct[size];
case GL_BYTE: return byte_types_direct[size];
@@ -241,8 +244,8 @@ get_surface_type(struct intel_context *intel, GLenum type, GLuint size,
case GL_UNSIGNED_BYTE: return ubyte_types_direct[size];
default: assert(0); return 0;
}
- } else if (normalized) {
- switch (type) {
+ } else if (glarray->Normalized) {
+ switch (glarray->Type) {
case GL_DOUBLE: return double_types[size];
case GL_FLOAT: return float_types[size];
case GL_HALF_FLOAT: return half_float_types[size];
@@ -252,7 +255,7 @@ get_surface_type(struct intel_context *intel, GLenum type, GLuint size,
case GL_UNSIGNED_INT: return uint_types_norm[size];
case GL_UNSIGNED_SHORT: return ushort_types_norm[size];
case GL_UNSIGNED_BYTE:
- if (format == GL_BGRA) {
+ if (glarray->Format == GL_BGRA) {
/* See GL_EXT_vertex_array_bgra */
assert(size == 4);
return BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
@@ -268,7 +271,7 @@ get_surface_type(struct intel_context *intel, GLenum type, GLuint size,
case GL_INT_2_10_10_10_REV:
assert(size == 4);
if (intel->gen >= 8 || intel->is_haswell) {
- return format == GL_BGRA
+ return glarray->Format == GL_BGRA
? BRW_SURFACEFORMAT_B10G10R10A2_SNORM
: BRW_SURFACEFORMAT_R10G10B10A2_SNORM;
}
@@ -276,7 +279,7 @@ get_surface_type(struct intel_context *intel, GLenum type, GLuint size,
case GL_UNSIGNED_INT_2_10_10_10_REV:
assert(size == 4);
if (intel->gen >= 8 || intel->is_haswell) {
- return format == GL_BGRA
+ return glarray->Format == GL_BGRA
? BRW_SURFACEFORMAT_B10G10R10A2_UNORM
: BRW_SURFACEFORMAT_R10G10B10A2_UNORM;
}
@@ -290,25 +293,25 @@ get_surface_type(struct intel_context *intel, GLenum type, GLuint size,
* like to use here, so upload everything as UINT and fix
* it in the shader
*/
- if (type == GL_INT_2_10_10_10_REV) {
+ if (glarray->Type == GL_INT_2_10_10_10_REV) {
assert(size == 4);
if (intel->gen >= 8 || intel->is_haswell) {
- return format == GL_BGRA
+ return glarray->Format == GL_BGRA
? BRW_SURFACEFORMAT_B10G10R10A2_SSCALED
: BRW_SURFACEFORMAT_R10G10B10A2_SSCALED;
}
return BRW_SURFACEFORMAT_R10G10B10A2_UINT;
- } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
+ } else if (glarray->Type == GL_UNSIGNED_INT_2_10_10_10_REV) {
assert(size == 4);
if (intel->gen >= 8 || intel->is_haswell) {
- return format == GL_BGRA
+ return glarray->Format == GL_BGRA
? BRW_SURFACEFORMAT_B10G10R10A2_USCALED
: BRW_SURFACEFORMAT_R10G10B10A2_USCALED;
}
return BRW_SURFACEFORMAT_R10G10B10A2_UINT;
}
- assert(format == GL_RGBA); /* sanity check */
- switch (type) {
+ assert(glarray->Format == GL_RGBA); /* sanity check */
+ switch (glarray->Type) {
case GL_DOUBLE: return double_types[size];
case GL_FLOAT: return float_types[size];
case GL_HALF_FLOAT: return half_float_types[size];
@@ -662,12 +665,7 @@ static void brw_emit_vertices(struct brw_context *brw)
OUT_BATCH((_3DSTATE_VERTEX_ELEMENTS << 16) | (2 * nr_elements - 1));
for (i = 0; i < brw->vb.nr_enabled; i++) {
struct brw_vertex_element *input = brw->vb.enabled[i];
- uint32_t format = get_surface_type(intel,
- input->glarray->Type,
- input->glarray->Size,
- input->glarray->Format,
- input->glarray->Normalized,
- input->glarray->Integer);
+ uint32_t format = get_surface_type(intel, input->glarray);
uint32_t comp0 = BRW_VE1_COMPONENT_STORE_SRC;
uint32_t comp1 = BRW_VE1_COMPONENT_STORE_SRC;
uint32_t comp2 = BRW_VE1_COMPONENT_STORE_SRC;
@@ -728,12 +726,7 @@ static void brw_emit_vertices(struct brw_context *brw)
}
if (intel->gen >= 6 && gen6_edgeflag_input) {
- uint32_t format = get_surface_type(intel,
- gen6_edgeflag_input->glarray->Type,
- gen6_edgeflag_input->glarray->Size,
- gen6_edgeflag_input->glarray->Format,
- gen6_edgeflag_input->glarray->Normalized,
- gen6_edgeflag_input->glarray->Integer);
+ uint32_t format = get_surface_type(intel, gen6_edgeflag_input->glarray);
OUT_BATCH((gen6_edgeflag_input->buffer << GEN6_VE0_INDEX_SHIFT) |
GEN6_VE0_VALID |