Re: [Mesa-dev] [PATCH] RFC gallium: add 64 bit integer formats

2018-04-10 Thread Marek Olšák
On Mon, Apr 9, 2018 at 9:14 PM, Karol Herbst  wrote:

> On Tue, Apr 10, 2018 at 2:43 AM, Ilia Mirkin  wrote:
> > On Mon, Apr 9, 2018 at 8:39 PM, Karol Herbst  wrote:
> >> unsigneds are needed by ARB_bindless_texture 64 bit vertex attribs,
> both for
> >> NV_vertex_attrib_integer64.
> >>
> >> Fixes the new piglit sampler-vertex-attrib-input-output test I sent
> some days
> >> ago for bindless_texture.
> >>
> >> The change inside vbo_attrtype_to_double_flag is what I am most
> concerned
> >> about. Maybe I should add another flag for 64 bit ints. Or rework what
> Doubles
> >> mean in gl_array_attributes. Or Rename that to is64Bit and rework all
> users of
> >> Doubles.
> >>
> >> Any suggestions?
> >>
> >> Signed-off-by: Karol Herbst 
> >> ---
> >>  src/gallium/drivers/svga/svga_format.c |  8 
> >>  src/gallium/include/pipe/p_format.h|  9 +
> >>  src/mesa/main/glformats.c  |  3 +++
> >>  src/mesa/state_tracker/st_atom_array.c | 30
> +++---
> >>  src/mesa/vbo/vbo_private.h |  2 +-
> >>  5 files changed, 48 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/src/gallium/drivers/svga/svga_format.c
> b/src/gallium/drivers/svga/svga_format.c
> >> index 20a6e6b159f..f01a0e79c72 100644
> >> --- a/src/gallium/drivers/svga/svga_format.c
> >> +++ b/src/gallium/drivers/svga/svga_format.c
> >> @@ -369,6 +369,14 @@ static const struct vgpu10_format_entry
> format_conversion_table[] =
> >> { PIPE_FORMAT_A1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> { PIPE_FORMAT_X1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> { PIPE_FORMAT_A4B4G4R4_UNORM,SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64_UINT,  SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64G64_UINT,   SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64G64B64_UINT,SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64G64B64A64_UINT, SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64_SINT,  SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64G64_SINT,   SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64G64B64_SINT,SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >> +   { PIPE_FORMAT_R64G64B64A64_SINT, SVGA3D_FORMAT_INVALID,
> SVGA3D_FORMAT_INVALID,   0 },
> >>  };
> >>
> >>
> >> diff --git a/src/gallium/include/pipe/p_format.h
> b/src/gallium/include/pipe/p_format.h
> >> index 57399800fa4..df698856b70 100644
> >> --- a/src/gallium/include/pipe/p_format.h
> >> +++ b/src/gallium/include/pipe/p_format.h
> >> @@ -396,6 +396,15 @@ enum pipe_format {
> >> PIPE_FORMAT_X1B5G5R5_UNORM  = 310,
> >> PIPE_FORMAT_A4B4G4R4_UNORM  = 311,
> >>
> >> +   PIPE_FORMAT_R64_UINT= 312,
> >> +   PIPE_FORMAT_R64G64_UINT = 313,
> >> +   PIPE_FORMAT_R64G64B64_UINT  = 314,
> >> +   PIPE_FORMAT_R64G64B64A64_UINT   = 315,
> >> +   PIPE_FORMAT_R64_SINT= 316,
> >> +   PIPE_FORMAT_R64G64_SINT = 317,
> >> +   PIPE_FORMAT_R64G64B64_SINT  = 318,
> >> +   PIPE_FORMAT_R64G64B64A64_SINT   = 319,
> >> +
> >> PIPE_FORMAT_COUNT
> >>  };
> >>
> >> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
> >> index 1e797c24c2a..feafd97f5ee 100644
> >> --- a/src/mesa/main/glformats.c
> >> +++ b/src/mesa/main/glformats.c
> >> @@ -543,6 +543,9 @@ _mesa_bytes_per_vertex_attrib(GLint comps, GLenum
> type)
> >> case GL_INT:
> >> case GL_UNSIGNED_INT:
> >>return comps * sizeof(GLint);
> >> +   /* ARB_bindless_texture */
> >> +   case GL_UNSIGNED_INT64_ARB:
> >> +  return comps * sizeof(GLuint64EXT);
> >> case GL_FLOAT:
> >>return comps * sizeof(GLfloat);
> >> case GL_HALF_FLOAT_ARB:
> >> diff --git a/src/mesa/state_tracker/st_atom_array.c
> b/src/mesa/state_tracker/st_atom_array.c
> >> index 2fd67e8d840..1c3f677d4bf 100644
> >> --- a/src/mesa/state_tracker/st_atom_array.c
> >> +++ b/src/mesa/state_tracker/st_atom_array.c
> >> @@ -230,6 +230,27 @@ static const uint16_t vertex_formats[][4][4] = {
> >>   PIPE_FORMAT_R32G32B32A32_FIXED
> >>},
> >> },
> >> +   {{0}}, /* gap */
> >> +   { /* GL_INT64_ARB */
> >> +  {0},
> >> +  {0},
> >> +  {
> >> + PIPE_FORMAT_R64_SINT,
> >> + PIPE_FORMAT_R64G64_SINT,
> >> + PIPE_FORMAT_R64G64B64_SINT,
> >> + PIPE_FORMAT_R64G64B64A64_SINT
> >> +  },
> >> +   },
> >> +   { /* GL_UNSIGNED_INT64_ARB */
> >> +  {0},
> >> +  {0},
> >> +  {
> >> + PIPE_FORMAT_R64_UINT,
> >> + 

Re: [Mesa-dev] [PATCH] RFC gallium: add 64 bit integer formats

2018-04-09 Thread Karol Herbst
On Tue, Apr 10, 2018 at 2:43 AM, Ilia Mirkin  wrote:
> On Mon, Apr 9, 2018 at 8:39 PM, Karol Herbst  wrote:
>> unsigneds are needed by ARB_bindless_texture 64 bit vertex attribs, both for
>> NV_vertex_attrib_integer64.
>>
>> Fixes the new piglit sampler-vertex-attrib-input-output test I sent some days
>> ago for bindless_texture.
>>
>> The change inside vbo_attrtype_to_double_flag is what I am most concerned
>> about. Maybe I should add another flag for 64 bit ints. Or rework what 
>> Doubles
>> mean in gl_array_attributes. Or Rename that to is64Bit and rework all users 
>> of
>> Doubles.
>>
>> Any suggestions?
>>
>> Signed-off-by: Karol Herbst 
>> ---
>>  src/gallium/drivers/svga/svga_format.c |  8 
>>  src/gallium/include/pipe/p_format.h|  9 +
>>  src/mesa/main/glformats.c  |  3 +++
>>  src/mesa/state_tracker/st_atom_array.c | 30 +++---
>>  src/mesa/vbo/vbo_private.h |  2 +-
>>  5 files changed, 48 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/gallium/drivers/svga/svga_format.c 
>> b/src/gallium/drivers/svga/svga_format.c
>> index 20a6e6b159f..f01a0e79c72 100644
>> --- a/src/gallium/drivers/svga/svga_format.c
>> +++ b/src/gallium/drivers/svga/svga_format.c
>> @@ -369,6 +369,14 @@ static const struct vgpu10_format_entry 
>> format_conversion_table[] =
>> { PIPE_FORMAT_A1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> { PIPE_FORMAT_X1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> { PIPE_FORMAT_A4B4G4R4_UNORM,SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64_UINT,  SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64G64_UINT,   SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64G64B64_UINT,SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64G64B64A64_UINT, SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64_SINT,  SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64G64_SINT,   SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64G64B64_SINT,SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>> +   { PIPE_FORMAT_R64G64B64A64_SINT, SVGA3D_FORMAT_INVALID,  
>> SVGA3D_FORMAT_INVALID,   0 },
>>  };
>>
>>
>> diff --git a/src/gallium/include/pipe/p_format.h 
>> b/src/gallium/include/pipe/p_format.h
>> index 57399800fa4..df698856b70 100644
>> --- a/src/gallium/include/pipe/p_format.h
>> +++ b/src/gallium/include/pipe/p_format.h
>> @@ -396,6 +396,15 @@ enum pipe_format {
>> PIPE_FORMAT_X1B5G5R5_UNORM  = 310,
>> PIPE_FORMAT_A4B4G4R4_UNORM  = 311,
>>
>> +   PIPE_FORMAT_R64_UINT= 312,
>> +   PIPE_FORMAT_R64G64_UINT = 313,
>> +   PIPE_FORMAT_R64G64B64_UINT  = 314,
>> +   PIPE_FORMAT_R64G64B64A64_UINT   = 315,
>> +   PIPE_FORMAT_R64_SINT= 316,
>> +   PIPE_FORMAT_R64G64_SINT = 317,
>> +   PIPE_FORMAT_R64G64B64_SINT  = 318,
>> +   PIPE_FORMAT_R64G64B64A64_SINT   = 319,
>> +
>> PIPE_FORMAT_COUNT
>>  };
>>
>> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
>> index 1e797c24c2a..feafd97f5ee 100644
>> --- a/src/mesa/main/glformats.c
>> +++ b/src/mesa/main/glformats.c
>> @@ -543,6 +543,9 @@ _mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
>> case GL_INT:
>> case GL_UNSIGNED_INT:
>>return comps * sizeof(GLint);
>> +   /* ARB_bindless_texture */
>> +   case GL_UNSIGNED_INT64_ARB:
>> +  return comps * sizeof(GLuint64EXT);
>> case GL_FLOAT:
>>return comps * sizeof(GLfloat);
>> case GL_HALF_FLOAT_ARB:
>> diff --git a/src/mesa/state_tracker/st_atom_array.c 
>> b/src/mesa/state_tracker/st_atom_array.c
>> index 2fd67e8d840..1c3f677d4bf 100644
>> --- a/src/mesa/state_tracker/st_atom_array.c
>> +++ b/src/mesa/state_tracker/st_atom_array.c
>> @@ -230,6 +230,27 @@ static const uint16_t vertex_formats[][4][4] = {
>>   PIPE_FORMAT_R32G32B32A32_FIXED
>>},
>> },
>> +   {{0}}, /* gap */
>> +   { /* GL_INT64_ARB */
>> +  {0},
>> +  {0},
>> +  {
>> + PIPE_FORMAT_R64_SINT,
>> + PIPE_FORMAT_R64G64_SINT,
>> + PIPE_FORMAT_R64G64B64_SINT,
>> + PIPE_FORMAT_R64G64B64A64_SINT
>> +  },
>> +   },
>> +   { /* GL_UNSIGNED_INT64_ARB */
>> +  {0},
>> +  {0},
>> +  {
>> + PIPE_FORMAT_R64_UINT,
>> + PIPE_FORMAT_R64G64_UINT,
>> + PIPE_FORMAT_R64G64B64_UINT,
>> + PIPE_FORMAT_R64G64B64A64_UINT
>> +  },
>> +   },
>
> Since these are never actually passed in via a single vertex attrib,
> is there 

Re: [Mesa-dev] [PATCH] RFC gallium: add 64 bit integer formats

2018-04-09 Thread Ilia Mirkin
On Mon, Apr 9, 2018 at 8:39 PM, Karol Herbst  wrote:
> unsigneds are needed by ARB_bindless_texture 64 bit vertex attribs, both for
> NV_vertex_attrib_integer64.
>
> Fixes the new piglit sampler-vertex-attrib-input-output test I sent some days
> ago for bindless_texture.
>
> The change inside vbo_attrtype_to_double_flag is what I am most concerned
> about. Maybe I should add another flag for 64 bit ints. Or rework what Doubles
> mean in gl_array_attributes. Or Rename that to is64Bit and rework all users of
> Doubles.
>
> Any suggestions?
>
> Signed-off-by: Karol Herbst 
> ---
>  src/gallium/drivers/svga/svga_format.c |  8 
>  src/gallium/include/pipe/p_format.h|  9 +
>  src/mesa/main/glformats.c  |  3 +++
>  src/mesa/state_tracker/st_atom_array.c | 30 +++---
>  src/mesa/vbo/vbo_private.h |  2 +-
>  5 files changed, 48 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/drivers/svga/svga_format.c 
> b/src/gallium/drivers/svga/svga_format.c
> index 20a6e6b159f..f01a0e79c72 100644
> --- a/src/gallium/drivers/svga/svga_format.c
> +++ b/src/gallium/drivers/svga/svga_format.c
> @@ -369,6 +369,14 @@ static const struct vgpu10_format_entry 
> format_conversion_table[] =
> { PIPE_FORMAT_A1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> { PIPE_FORMAT_X1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> { PIPE_FORMAT_A4B4G4R4_UNORM,SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64_UINT,  SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64G64_UINT,   SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64G64B64_UINT,SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64G64B64A64_UINT, SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64_SINT,  SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64G64_SINT,   SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64G64B64_SINT,SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
> +   { PIPE_FORMAT_R64G64B64A64_SINT, SVGA3D_FORMAT_INVALID,  
> SVGA3D_FORMAT_INVALID,   0 },
>  };
>
>
> diff --git a/src/gallium/include/pipe/p_format.h 
> b/src/gallium/include/pipe/p_format.h
> index 57399800fa4..df698856b70 100644
> --- a/src/gallium/include/pipe/p_format.h
> +++ b/src/gallium/include/pipe/p_format.h
> @@ -396,6 +396,15 @@ enum pipe_format {
> PIPE_FORMAT_X1B5G5R5_UNORM  = 310,
> PIPE_FORMAT_A4B4G4R4_UNORM  = 311,
>
> +   PIPE_FORMAT_R64_UINT= 312,
> +   PIPE_FORMAT_R64G64_UINT = 313,
> +   PIPE_FORMAT_R64G64B64_UINT  = 314,
> +   PIPE_FORMAT_R64G64B64A64_UINT   = 315,
> +   PIPE_FORMAT_R64_SINT= 316,
> +   PIPE_FORMAT_R64G64_SINT = 317,
> +   PIPE_FORMAT_R64G64B64_SINT  = 318,
> +   PIPE_FORMAT_R64G64B64A64_SINT   = 319,
> +
> PIPE_FORMAT_COUNT
>  };
>
> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
> index 1e797c24c2a..feafd97f5ee 100644
> --- a/src/mesa/main/glformats.c
> +++ b/src/mesa/main/glformats.c
> @@ -543,6 +543,9 @@ _mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
> case GL_INT:
> case GL_UNSIGNED_INT:
>return comps * sizeof(GLint);
> +   /* ARB_bindless_texture */
> +   case GL_UNSIGNED_INT64_ARB:
> +  return comps * sizeof(GLuint64EXT);
> case GL_FLOAT:
>return comps * sizeof(GLfloat);
> case GL_HALF_FLOAT_ARB:
> diff --git a/src/mesa/state_tracker/st_atom_array.c 
> b/src/mesa/state_tracker/st_atom_array.c
> index 2fd67e8d840..1c3f677d4bf 100644
> --- a/src/mesa/state_tracker/st_atom_array.c
> +++ b/src/mesa/state_tracker/st_atom_array.c
> @@ -230,6 +230,27 @@ static const uint16_t vertex_formats[][4][4] = {
>   PIPE_FORMAT_R32G32B32A32_FIXED
>},
> },
> +   {{0}}, /* gap */
> +   { /* GL_INT64_ARB */
> +  {0},
> +  {0},
> +  {
> + PIPE_FORMAT_R64_SINT,
> + PIPE_FORMAT_R64G64_SINT,
> + PIPE_FORMAT_R64G64B64_SINT,
> + PIPE_FORMAT_R64G64B64A64_SINT
> +  },
> +   },
> +   { /* GL_UNSIGNED_INT64_ARB */
> +  {0},
> +  {0},
> +  {
> + PIPE_FORMAT_R64_UINT,
> + PIPE_FORMAT_R64G64_UINT,
> + PIPE_FORMAT_R64G64B64_UINT,
> + PIPE_FORMAT_R64G64B64A64_UINT
> +  },
> +   },

Since these are never actually passed in via a single vertex attrib,
is there any way to not add these at all, and just handle the
conversion from 64-bit to 2x 32-bit entirely internally to st/mesa?
(Note that R64_FLOAT *can* be actually passed to a driver, and it is
*not* the 

[Mesa-dev] [PATCH] RFC gallium: add 64 bit integer formats

2018-04-09 Thread Karol Herbst
unsigneds are needed by ARB_bindless_texture 64 bit vertex attribs, both for
NV_vertex_attrib_integer64.

Fixes the new piglit sampler-vertex-attrib-input-output test I sent some days
ago for bindless_texture.

The change inside vbo_attrtype_to_double_flag is what I am most concerned
about. Maybe I should add another flag for 64 bit ints. Or rework what Doubles
mean in gl_array_attributes. Or Rename that to is64Bit and rework all users of
Doubles.

Any suggestions?

Signed-off-by: Karol Herbst 
---
 src/gallium/drivers/svga/svga_format.c |  8 
 src/gallium/include/pipe/p_format.h|  9 +
 src/mesa/main/glformats.c  |  3 +++
 src/mesa/state_tracker/st_atom_array.c | 30 +++---
 src/mesa/vbo/vbo_private.h |  2 +-
 5 files changed, 48 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/svga/svga_format.c 
b/src/gallium/drivers/svga/svga_format.c
index 20a6e6b159f..f01a0e79c72 100644
--- a/src/gallium/drivers/svga/svga_format.c
+++ b/src/gallium/drivers/svga/svga_format.c
@@ -369,6 +369,14 @@ static const struct vgpu10_format_entry 
format_conversion_table[] =
{ PIPE_FORMAT_A1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
{ PIPE_FORMAT_X1B5G5R5_UNORM,SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
{ PIPE_FORMAT_A4B4G4R4_UNORM,SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64_UINT,  SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64G64_UINT,   SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64G64B64_UINT,SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64G64B64A64_UINT, SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64_SINT,  SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64G64_SINT,   SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64G64B64_SINT,SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
+   { PIPE_FORMAT_R64G64B64A64_SINT, SVGA3D_FORMAT_INVALID,  
SVGA3D_FORMAT_INVALID,   0 },
 };
 
 
diff --git a/src/gallium/include/pipe/p_format.h 
b/src/gallium/include/pipe/p_format.h
index 57399800fa4..df698856b70 100644
--- a/src/gallium/include/pipe/p_format.h
+++ b/src/gallium/include/pipe/p_format.h
@@ -396,6 +396,15 @@ enum pipe_format {
PIPE_FORMAT_X1B5G5R5_UNORM  = 310,
PIPE_FORMAT_A4B4G4R4_UNORM  = 311,
 
+   PIPE_FORMAT_R64_UINT= 312,
+   PIPE_FORMAT_R64G64_UINT = 313,
+   PIPE_FORMAT_R64G64B64_UINT  = 314,
+   PIPE_FORMAT_R64G64B64A64_UINT   = 315,
+   PIPE_FORMAT_R64_SINT= 316,
+   PIPE_FORMAT_R64G64_SINT = 317,
+   PIPE_FORMAT_R64G64B64_SINT  = 318,
+   PIPE_FORMAT_R64G64B64A64_SINT   = 319,
+
PIPE_FORMAT_COUNT
 };
 
diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
index 1e797c24c2a..feafd97f5ee 100644
--- a/src/mesa/main/glformats.c
+++ b/src/mesa/main/glformats.c
@@ -543,6 +543,9 @@ _mesa_bytes_per_vertex_attrib(GLint comps, GLenum type)
case GL_INT:
case GL_UNSIGNED_INT:
   return comps * sizeof(GLint);
+   /* ARB_bindless_texture */
+   case GL_UNSIGNED_INT64_ARB:
+  return comps * sizeof(GLuint64EXT);
case GL_FLOAT:
   return comps * sizeof(GLfloat);
case GL_HALF_FLOAT_ARB:
diff --git a/src/mesa/state_tracker/st_atom_array.c 
b/src/mesa/state_tracker/st_atom_array.c
index 2fd67e8d840..1c3f677d4bf 100644
--- a/src/mesa/state_tracker/st_atom_array.c
+++ b/src/mesa/state_tracker/st_atom_array.c
@@ -230,6 +230,27 @@ static const uint16_t vertex_formats[][4][4] = {
  PIPE_FORMAT_R32G32B32A32_FIXED
   },
},
+   {{0}}, /* gap */
+   { /* GL_INT64_ARB */
+  {0},
+  {0},
+  {
+ PIPE_FORMAT_R64_SINT,
+ PIPE_FORMAT_R64G64_SINT,
+ PIPE_FORMAT_R64G64B64_SINT,
+ PIPE_FORMAT_R64G64B64A64_SINT
+  },
+   },
+   { /* GL_UNSIGNED_INT64_ARB */
+  {0},
+  {0},
+  {
+ PIPE_FORMAT_R64_UINT,
+ PIPE_FORMAT_R64G64_UINT,
+ PIPE_FORMAT_R64G64B64_UINT,
+ PIPE_FORMAT_R64G64B64A64_UINT
+  },
+   },
 };
 
 
@@ -244,7 +265,7 @@ st_pipe_vertex_format(const struct gl_array_attributes 
*attrib)
const bool normalized = attrib->Normalized;
const bool integer = attrib->Integer;
GLenum16 type = attrib->Type;
-   unsigned index;
+   unsigned index = integer*2 + normalized;
 
assert(size >= 1 && size <= 4);
assert(format == GL_RGBA || format == GL_BGRA);
@@ -298,11 +319,14 @@ st_pipe_vertex_format(const struct gl_array_attributes 
*attrib)
  return PIPE_FORMAT_B8G8R8A8_UNORM;
   }
   break;
+   case GL_UNSIGNED_INT64_ARB:
+   case GL_INT64_ARB:
+