1 /**************************************************************************
3 * Copyright 2016 Ilia Mirkin. All Rights Reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial portions
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 **************************************************************************/
27 #include "main/imports.h"
28 #include "program/prog_parameter.h"
29 #include "program/prog_print.h"
30 #include "compiler/glsl/ir_uniform.h"
32 #include "pipe/p_context.h"
33 #include "pipe/p_defines.h"
34 #include "util/u_inlines.h"
35 #include "util/u_surface.h"
37 #include "st_cb_texture.h"
39 #include "st_texture.h"
40 #include "st_context.h"
42 #include "st_program.h"
43 #include "st_format.h"
46 st_bind_images(struct st_context
*st
, struct gl_shader
*shader
,
50 struct pipe_image_view images
[MAX_IMAGE_UNIFORMS
];
51 struct gl_program_constants
*c
= &st
->ctx
->Const
.Program
[shader
->Stage
];
53 if (!shader
|| !st
->pipe
->set_shader_images
)
56 for (i
= 0; i
< shader
->NumImages
; i
++) {
57 struct gl_image_unit
*u
= &st
->ctx
->ImageUnits
[shader
->ImageUnits
[i
]];
58 struct st_texture_object
*stObj
= st_texture_object(u
->TexObj
);
59 struct pipe_image_view
*img
= &images
[i
];
62 !st_finalize_texture(st
->ctx
, st
->pipe
, u
->TexObj
) ||
64 memset(img
, 0, sizeof(*img
));
68 img
->resource
= stObj
->pt
;
69 img
->format
= st_mesa_format_to_pipe_format(st
, u
->_ActualFormat
);
70 if (stObj
->pt
->target
== PIPE_BUFFER
) {
73 const struct util_format_description
*desc
74 = util_format_description(img
->format
);
76 base
= stObj
->base
.BufferOffset
;
77 assert(base
< stObj
->pt
->width0
);
78 size
= MIN2(stObj
->pt
->width0
- base
, (unsigned)stObj
->base
.BufferSize
);
80 f
= (base
/ (desc
->block
.bits
/ 8)) * desc
->block
.width
;
81 n
= (size
/ (desc
->block
.bits
/ 8)) * desc
->block
.width
;
83 img
->u
.buf
.first_element
= f
;
84 img
->u
.buf
.last_element
= f
+ (n
- 1);
86 img
->u
.tex
.level
= u
->Level
+ stObj
->base
.MinLevel
;
87 if (stObj
->pt
->target
== PIPE_TEXTURE_3D
) {
89 img
->u
.tex
.first_layer
= 0;
90 img
->u
.tex
.last_layer
= u_minify(stObj
->pt
->depth0
, img
->u
.tex
.level
) - 1;
92 img
->u
.tex
.first_layer
= u
->_Layer
;
93 img
->u
.tex
.last_layer
= u
->_Layer
;
96 img
->u
.tex
.first_layer
= u
->_Layer
+ stObj
->base
.MinLayer
;
97 img
->u
.tex
.last_layer
= u
->_Layer
+ stObj
->base
.MinLayer
;
98 if (u
->Layered
&& img
->resource
->array_size
> 1) {
99 if (stObj
->base
.Immutable
)
100 img
->u
.tex
.last_layer
+= stObj
->base
.NumLayers
- 1;
102 img
->u
.tex
.last_layer
+= img
->resource
->array_size
- 1;
107 st
->pipe
->set_shader_images(st
->pipe
, shader_type
, 0, shader
->NumImages
,
109 /* clear out any stale shader images */
110 if (shader
->NumImages
< c
->MaxImageUniforms
)
111 st
->pipe
->set_shader_images(
112 st
->pipe
, shader_type
,
114 c
->MaxImageUniforms
- shader
->NumImages
,
118 static void bind_vs_images(struct st_context
*st
)
120 struct gl_shader_program
*prog
=
121 st
->ctx
->_Shader
->CurrentProgram
[MESA_SHADER_VERTEX
];
126 st_bind_images(st
, prog
->_LinkedShaders
[MESA_SHADER_VERTEX
], PIPE_SHADER_VERTEX
);
129 const struct st_tracked_state st_bind_vs_images
= {
133 ST_NEW_VERTEX_PROGRAM
| ST_NEW_IMAGE_UNITS
,
138 static void bind_fs_images(struct st_context
*st
)
140 struct gl_shader_program
*prog
=
141 st
->ctx
->_Shader
->CurrentProgram
[MESA_SHADER_FRAGMENT
];
146 st_bind_images(st
, prog
->_LinkedShaders
[MESA_SHADER_FRAGMENT
], PIPE_SHADER_FRAGMENT
);
149 const struct st_tracked_state st_bind_fs_images
= {
153 ST_NEW_FRAGMENT_PROGRAM
| ST_NEW_IMAGE_UNITS
,
158 static void bind_gs_images(struct st_context
*st
)
160 struct gl_shader_program
*prog
=
161 st
->ctx
->_Shader
->CurrentProgram
[MESA_SHADER_GEOMETRY
];
166 st_bind_images(st
, prog
->_LinkedShaders
[MESA_SHADER_GEOMETRY
], PIPE_SHADER_GEOMETRY
);
169 const struct st_tracked_state st_bind_gs_images
= {
173 ST_NEW_GEOMETRY_PROGRAM
| ST_NEW_IMAGE_UNITS
,
178 static void bind_tcs_images(struct st_context
*st
)
180 struct gl_shader_program
*prog
=
181 st
->ctx
->_Shader
->CurrentProgram
[MESA_SHADER_TESS_CTRL
];
186 st_bind_images(st
, prog
->_LinkedShaders
[MESA_SHADER_TESS_CTRL
], PIPE_SHADER_TESS_CTRL
);
189 const struct st_tracked_state st_bind_tcs_images
= {
190 "st_bind_tcs_images",
193 ST_NEW_TESSCTRL_PROGRAM
| ST_NEW_IMAGE_UNITS
,
198 static void bind_tes_images(struct st_context
*st
)
200 struct gl_shader_program
*prog
=
201 st
->ctx
->_Shader
->CurrentProgram
[MESA_SHADER_TESS_EVAL
];
206 st_bind_images(st
, prog
->_LinkedShaders
[MESA_SHADER_TESS_EVAL
], PIPE_SHADER_TESS_EVAL
);
209 const struct st_tracked_state st_bind_tes_images
= {
210 "st_bind_tes_images",
213 ST_NEW_TESSEVAL_PROGRAM
| ST_NEW_IMAGE_UNITS
,
218 static void bind_cs_images(struct st_context
*st
)
220 struct gl_shader_program
*prog
=
221 st
->ctx
->_Shader
->CurrentProgram
[MESA_SHADER_COMPUTE
];
226 st_bind_images(st
, prog
->_LinkedShaders
[MESA_SHADER_COMPUTE
], PIPE_SHADER_COMPUTE
);
229 const struct st_tracked_state st_bind_cs_images
= {
233 ST_NEW_COMPUTE_PROGRAM
| ST_NEW_IMAGE_UNITS
,