const struct lp_fragment_shader_variant_key *key)
{
struct lp_fragment_shader_variant *variant;
+ const struct util_format_description *cbuf0_format_desc;
boolean fullcolormask;
variant = CALLOC_STRUCT(lp_fragment_shader_variant);
*/
fullcolormask = FALSE;
if (key->nr_cbufs == 1) {
- const struct util_format_description *format_desc;
- format_desc = util_format_description(key->cbuf_format[0]);
- if ((~key->blend.rt[0].colormask &
- util_format_colormask(format_desc)) == 0) {
- fullcolormask = TRUE;
- }
+ cbuf0_format_desc = util_format_description(key->cbuf_format[0]);
+ fullcolormask = util_format_colormask_full(cbuf0_format_desc, key->blend.rt[0].colormask);
}
variant->opaque =
{
struct llvmpipe_context *llvmpipe = llvmpipe_context(pipe);
struct pipe_resource *constants = cb ? cb->buffer : NULL;
- unsigned size = constants ? constants->width0 : 0;
- const void *data = constants ? llvmpipe_resource_data(constants) : NULL;
+ unsigned size;
+ const void *data;
+
+ if (cb && cb->user_buffer) {
+ constants = llvmpipe_user_buffer_create(pipe->screen, cb->user_buffer,
+ cb->buffer_size,
+ PIPE_BIND_CONSTANT_BUFFER);
+ }
+
+ size = constants ? constants->width0 : 0;
+ data = constants ? llvmpipe_resource_data(constants) : NULL;
assert(shader < PIPE_SHADER_TYPES);
assert(index < PIPE_MAX_CONSTANT_BUFFERS);
}
llvmpipe->dirty |= LP_NEW_CONSTANTS;
+
+ if (cb && cb->user_buffer) {
+ pipe_resource_reference(&constants, NULL);
+ }
}