mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 03:48:06 +02:00
nv50: enable texture query lod
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
4dc13e3c71
commit
d5faf8e786
6 changed files with 34 additions and 1 deletions
|
|
@ -117,6 +117,7 @@ enum operation
|
||||||
OP_TXQ, // texture size query
|
OP_TXQ, // texture size query
|
||||||
OP_TXD, // texture derivatives
|
OP_TXD, // texture derivatives
|
||||||
OP_TXG, // texture gather
|
OP_TXG, // texture gather
|
||||||
|
OP_TXLQ, // texture query lod
|
||||||
OP_TEXCSAA, // texture op for coverage sampling
|
OP_TEXCSAA, // texture op for coverage sampling
|
||||||
OP_TEXPREP, // turn cube map array into 2d array coordinates
|
OP_TEXPREP, // turn cube map array into 2d array coordinates
|
||||||
OP_SULDB, // surface load (raw)
|
OP_SULDB, // surface load (raw)
|
||||||
|
|
|
||||||
|
|
@ -1450,6 +1450,9 @@ CodeEmitterNV50::emitTEX(const TexInstruction *i)
|
||||||
code[0] |= 0x01000000;
|
code[0] |= 0x01000000;
|
||||||
code[1] = 0x80000000;
|
code[1] = 0x80000000;
|
||||||
break;
|
break;
|
||||||
|
case OP_TXLQ:
|
||||||
|
code[1] = 0x60020000;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(i->op == OP_TEX);
|
assert(i->op == OP_TEX);
|
||||||
break;
|
break;
|
||||||
|
|
@ -1791,6 +1794,7 @@ CodeEmitterNV50::emitInstruction(Instruction *insn)
|
||||||
case OP_TXL:
|
case OP_TXL:
|
||||||
case OP_TXF:
|
case OP_TXF:
|
||||||
case OP_TXG:
|
case OP_TXG:
|
||||||
|
case OP_TXLQ:
|
||||||
emitTEX(insn->asTex());
|
emitTEX(insn->asTex());
|
||||||
break;
|
break;
|
||||||
case OP_TXQ:
|
case OP_TXQ:
|
||||||
|
|
|
||||||
|
|
@ -255,6 +255,7 @@ unsigned int Instruction::srcMask(unsigned int s) const
|
||||||
case TGSI_OPCODE_TXD:
|
case TGSI_OPCODE_TXD:
|
||||||
case TGSI_OPCODE_TXL:
|
case TGSI_OPCODE_TXL:
|
||||||
case TGSI_OPCODE_TXP:
|
case TGSI_OPCODE_TXP:
|
||||||
|
case TGSI_OPCODE_LODQ:
|
||||||
{
|
{
|
||||||
const struct tgsi_instruction_texture *tex = &insn->Texture;
|
const struct tgsi_instruction_texture *tex = &insn->Texture;
|
||||||
|
|
||||||
|
|
@ -559,6 +560,7 @@ static nv50_ir::operation translateOpcode(uint opcode)
|
||||||
NV50_IR_OPCODE_CASE(TXF, TXF);
|
NV50_IR_OPCODE_CASE(TXF, TXF);
|
||||||
NV50_IR_OPCODE_CASE(TXQ, TXQ);
|
NV50_IR_OPCODE_CASE(TXQ, TXQ);
|
||||||
NV50_IR_OPCODE_CASE(TG4, TXG);
|
NV50_IR_OPCODE_CASE(TG4, TXG);
|
||||||
|
NV50_IR_OPCODE_CASE(LODQ, TXLQ);
|
||||||
|
|
||||||
NV50_IR_OPCODE_CASE(EMIT, EMIT);
|
NV50_IR_OPCODE_CASE(EMIT, EMIT);
|
||||||
NV50_IR_OPCODE_CASE(ENDPRIM, RESTART);
|
NV50_IR_OPCODE_CASE(ENDPRIM, RESTART);
|
||||||
|
|
@ -2429,6 +2431,7 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn)
|
||||||
case TGSI_OPCODE_TXB:
|
case TGSI_OPCODE_TXB:
|
||||||
case TGSI_OPCODE_TXL:
|
case TGSI_OPCODE_TXL:
|
||||||
case TGSI_OPCODE_TXP:
|
case TGSI_OPCODE_TXP:
|
||||||
|
case TGSI_OPCODE_LODQ:
|
||||||
// R S L C Dx Dy
|
// R S L C Dx Dy
|
||||||
handleTEX(dst0, 1, 1, 0x03, 0x0f, 0x00, 0x00);
|
handleTEX(dst0, 1, 1, 0x03, 0x0f, 0x00, 0x00);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -543,6 +543,7 @@ private:
|
||||||
bool handleTXB(TexInstruction *); // I really
|
bool handleTXB(TexInstruction *); // I really
|
||||||
bool handleTXL(TexInstruction *); // hate
|
bool handleTXL(TexInstruction *); // hate
|
||||||
bool handleTXD(TexInstruction *); // these 3
|
bool handleTXD(TexInstruction *); // these 3
|
||||||
|
bool handleTXLQ(TexInstruction *);
|
||||||
|
|
||||||
bool handleCALL(Instruction *);
|
bool handleCALL(Instruction *);
|
||||||
bool handlePRECONT(Instruction *);
|
bool handlePRECONT(Instruction *);
|
||||||
|
|
@ -856,6 +857,26 @@ NV50LoweringPreSSA::handleTXD(TexInstruction *i)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
NV50LoweringPreSSA::handleTXLQ(TexInstruction *i)
|
||||||
|
{
|
||||||
|
handleTEX(i);
|
||||||
|
bld.setPosition(i, true);
|
||||||
|
|
||||||
|
/* The returned values are not quite what we want:
|
||||||
|
* (a) convert from s32 to f32
|
||||||
|
* (b) multiply by 1/256
|
||||||
|
*/
|
||||||
|
for (int def = 0; def < 2; ++def) {
|
||||||
|
if (!i->defExists(def))
|
||||||
|
continue;
|
||||||
|
bld.mkCvt(OP_CVT, TYPE_F32, i->getDef(def), TYPE_S32, i->getDef(def));
|
||||||
|
bld.mkOp2(OP_MUL, TYPE_F32, i->getDef(def),
|
||||||
|
i->getDef(def), bld.loadImm(NULL, 1.0f / 256));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
NV50LoweringPreSSA::handleSET(Instruction *i)
|
NV50LoweringPreSSA::handleSET(Instruction *i)
|
||||||
{
|
{
|
||||||
|
|
@ -1197,6 +1218,8 @@ NV50LoweringPreSSA::visit(Instruction *i)
|
||||||
return handleTXL(i->asTex());
|
return handleTXL(i->asTex());
|
||||||
case OP_TXD:
|
case OP_TXD:
|
||||||
return handleTXD(i->asTex());
|
return handleTXD(i->asTex());
|
||||||
|
case OP_TXLQ:
|
||||||
|
return handleTXLQ(i->asTex());
|
||||||
case OP_EX2:
|
case OP_EX2:
|
||||||
bld.mkOp1(OP_PREEX2, TYPE_F32, i->getDef(0), i->getSrc(0));
|
bld.mkOp1(OP_PREEX2, TYPE_F32, i->getDef(0), i->getSrc(0));
|
||||||
i->setSrc(0, i->getDef(0));
|
i->setSrc(0, i->getDef(0));
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,7 @@ const char *operationStr[OP_LAST + 1] =
|
||||||
"texquery",
|
"texquery",
|
||||||
"texgrad",
|
"texgrad",
|
||||||
"texgather",
|
"texgather",
|
||||||
|
"texquerylod",
|
||||||
"texcsaa",
|
"texcsaa",
|
||||||
"texprep",
|
"texprep",
|
||||||
"suldb",
|
"suldb",
|
||||||
|
|
|
||||||
|
|
@ -196,12 +196,13 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
||||||
case PIPE_CAP_TEXTURE_GATHER_SM5:
|
case PIPE_CAP_TEXTURE_GATHER_SM5:
|
||||||
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
|
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
|
||||||
case PIPE_CAP_FAKE_SW_MSAA:
|
case PIPE_CAP_FAKE_SW_MSAA:
|
||||||
case PIPE_CAP_TEXTURE_QUERY_LOD:
|
|
||||||
return 0;
|
return 0;
|
||||||
case PIPE_CAP_MAX_VIEWPORTS:
|
case PIPE_CAP_MAX_VIEWPORTS:
|
||||||
return NV50_MAX_VIEWPORTS;
|
return NV50_MAX_VIEWPORTS;
|
||||||
case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
|
case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
|
||||||
return (class_3d >= NVA3_3D_CLASS) ? 4 : 0;
|
return (class_3d >= NVA3_3D_CLASS) ? 4 : 0;
|
||||||
|
case PIPE_CAP_TEXTURE_QUERY_LOD:
|
||||||
|
return class_3d >= NVA3_3D_CLASS;
|
||||||
default:
|
default:
|
||||||
NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
|
NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue