mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 21:10:12 +01:00
virgl: add ARB_cull_distance support.
This just allows the properties through to the host if we have cull dist support. Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
d7a015cbc6
commit
fa683385de
4 changed files with 13 additions and 5 deletions
|
|
@ -469,7 +469,7 @@ static void *virgl_shader_encoder(struct pipe_context *ctx,
|
|||
struct tgsi_token *new_tokens;
|
||||
int ret;
|
||||
|
||||
new_tokens = virgl_tgsi_transform(shader->tokens);
|
||||
new_tokens = virgl_tgsi_transform(vctx, shader->tokens);
|
||||
if (!new_tokens)
|
||||
return NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -109,6 +109,6 @@ void virgl_transfer_inline_write(struct pipe_context *ctx,
|
|||
unsigned stride,
|
||||
unsigned layer_stride);
|
||||
|
||||
struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in);
|
||||
struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct tgsi_token *tokens_in);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -196,6 +196,8 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_SAMPLE_SHADING:
|
||||
case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
|
||||
return vscreen->caps.caps.v1.bset.has_sample_shading;
|
||||
case PIPE_CAP_CULL_DISTANCE:
|
||||
return vscreen->caps.caps.v1.bset.has_cull;
|
||||
case PIPE_CAP_TEXTURE_GATHER_SM5:
|
||||
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
|
||||
case PIPE_CAP_FAKE_SW_MSAA:
|
||||
|
|
@ -239,7 +241,6 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||
case PIPE_CAP_PCI_FUNCTION:
|
||||
case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
|
||||
case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
|
||||
case PIPE_CAP_CULL_DISTANCE:
|
||||
case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
|
||||
case PIPE_CAP_TGSI_VOTE:
|
||||
case PIPE_CAP_MAX_WINDOW_RECTANGLES:
|
||||
|
|
|
|||
|
|
@ -27,8 +27,10 @@
|
|||
*/
|
||||
#include "tgsi/tgsi_transform.h"
|
||||
#include "virgl_context.h"
|
||||
#include "virgl_screen.h"
|
||||
struct virgl_transform_context {
|
||||
struct tgsi_transform_context base;
|
||||
bool cull_enabled;
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
@ -55,9 +57,13 @@ static void
|
|||
virgl_tgsi_transform_property(struct tgsi_transform_context *ctx,
|
||||
struct tgsi_full_property *prop)
|
||||
{
|
||||
struct virgl_transform_context *vtctx = (struct virgl_transform_context *)ctx;
|
||||
switch (prop->Property.PropertyName) {
|
||||
case TGSI_PROPERTY_NUM_CLIPDIST_ENABLED:
|
||||
case TGSI_PROPERTY_NUM_CULLDIST_ENABLED:
|
||||
if (vtctx->cull_enabled)
|
||||
ctx->emit_property(ctx, prop);
|
||||
break;
|
||||
case TGSI_PROPERTY_NEXT_SHADER:
|
||||
break;
|
||||
default:
|
||||
|
|
@ -82,9 +88,9 @@ virgl_tgsi_transform_instruction(struct tgsi_transform_context *ctx,
|
|||
ctx->emit_instruction(ctx, inst);
|
||||
}
|
||||
|
||||
struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in)
|
||||
struct tgsi_token *virgl_tgsi_transform(struct virgl_context *vctx, const struct tgsi_token *tokens_in)
|
||||
{
|
||||
|
||||
struct virgl_screen *vscreen = (struct virgl_screen *)vctx->base.screen;
|
||||
struct virgl_transform_context transform;
|
||||
const uint newLen = tgsi_num_tokens(tokens_in);
|
||||
struct tgsi_token *new_tokens;
|
||||
|
|
@ -97,6 +103,7 @@ struct tgsi_token *virgl_tgsi_transform(const struct tgsi_token *tokens_in)
|
|||
transform.base.transform_declaration = virgl_tgsi_transform_declaration;
|
||||
transform.base.transform_property = virgl_tgsi_transform_property;
|
||||
transform.base.transform_instruction = virgl_tgsi_transform_instruction;
|
||||
transform.cull_enabled = vscreen->caps.caps.v1.bset.has_cull;
|
||||
tgsi_transform_shader(tokens_in, new_tokens, newLen, &transform.base);
|
||||
|
||||
return new_tokens;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue